2009-10-28 4 views
0

У меня возникла следующая проблема. У меня есть номера 1/2/3/4/5/6, и я хочу разделить их на две группы 1/3/5 и 2/4/6. Выбор должен выполняться в зависимости от позиции. Эта часть работает нормально. Проблема возникает, когда я хочу снова сгруппировать их, когда я использую функцию implode; он видит только последнее число, которое было сохранено. Я знаю, что это что-то делать со мной, используя эту нотацию (я выбрал этот путь, так как количество чисел для классификации изменяется каждый раз):Использование implode для группировки информации из приобретенных в whileloop

$q++; 
$row0 = $row0 + 2; 
$row1 = $row1 + 2; 

, но я не могу найти способ, чтобы исправить это так или иначе чтобы получить тот же результат. Надеюсь, кто-то здесь может указать мне в правильном направлении. Я оставил полный код ниже.


<? 
$string = "1/2/3/4/5/6"; 
$splitted = explode("/",$string); 
$cnt = count($splitted); 
$q=0; 
$row0=0; 
$row1=1; 
while($cnt > 2*$q) 
{ 
    $p_row = implode(array($splitted[$row0])); 
    echo "$p_row <br>"; 
    $i_row = implode(array($splitted[$row1])); 
    echo "$i_row <br>"; 

    $q++; 
    $row0 = $row0 + 2; 
    $row1 = $row1 + 2; 
} 
$out = "implode(',', $i_row)"; 
var_dump($out); 
?> 

ответ

0

Вы можете разбить массив на группы с помощью % по индексу цикла. Поместите каждую группу в отдельный массив. Вот пример:

<?php 
    $string = "1/2/3/4/5/6"; 
    $splitted = explode("/",$string); 
    $group_odd = array(); ## all odd elements of $splitted come here 
    $group_even = array(); ## all even elements of $splitted come here 
    for ($index = 0; $index < count($splitted); ++$index) { 
     ## if number is divided by 2 with rest then it's odd 
     ## but we've started calculation from 0, so we need to add 1 
     if (($index+1) % 2) { 
      $group_odd[] = $splitted[$index]; 
     } 
     else { 
      $group_even[] = $splitted[$index]; 
     } 
    } 
    echo implode('/', $group_odd), "<br />"; ## outputs "1/3/5<br />" 
    echo implode('/', $group_even), "<br />"; ## outputs "2/4/6<br />" 
    print_r($group_odd); 
    print_r($group_even); 
?> 
+0

Я только что проверил ваш совет, и он работает хорошо. Мы пытались решить это для нас и не могли найти пути. Большое спасибо :-) – Nigg

+0

Индексные вычисления могут быть очень сложными –

0

Основано на их положении? Итак, раскол основан на четности/нечетности их индекса в массиве?

Что-то вроде этого?

<?php 

$string = "1/2/3/4/5/6"; 

list($evenKeys, $oddKeys) = array_split_custom(explode('/', $string)); 

echo '<pre>'; 
print_r($evenKeys); 
print_r($oddKeys); 

function array_split_custom(array $input) 
{ 
    $evens = array(); 
    $odds = array(); 
    foreach ($input as $index => $value) 
    { 
    if ($index & 1) 
    { 
     $odds[] = $value; 
    } else { 
     $evens[] = $value; 
    } 
    } 
    return array($evens, $odds); 
} 
1

Я пропустил проблему, кажется. Вместо этого я даю эту оптимизацию.

$string = "1/2/3/4/5/6"; 
$splitted = explode("/", $string); 
$group = array(); 
for ($index = 0, $t = count($splitted); $index < $t; ++$index) { 
    $group[$index & 1][] = $splitted[$index]; 
} 
$oddIndex = $group[0]; //start with index 1 
$evenIndex = $group[1]; //start with index 2 

echo "odd index: " 
    . implode('/', $oddIndex) 
    . "\neven index: " 
    . implode('/', $evenIndex) 
    . "\n"; 
+1

Единственное, что я могу думать, это то, что он хочет сделать это по индексу массива, а не по значению массива. – Zak

Смежные вопросы