Замена массива в цикле foreach на массив, модифицированный в том же цикле - PullRequest
1 голос
/ 23 октября 2008
foreach($arrayOne as $value){
    do function
}

В приведенном выше примере я хотел бы передать $ arrayOne в цикл, иметь функцию, которая удаляет некоторые элементы $ arrayOne, а затем передать цикл по уменьшенному $ arrayOne для элементов, оставшихся до цикл возвращает false.

Рекомендации

Ответы [ 5 ]

5 голосов
/ 23 октября 2008

Вам просто нужна функция для удаления некоторых элементов массива?

Если это так, вы можете использовать array_filter .

3 голосов
/ 23 октября 2008

Если вы хотите внести изменения в значение элементов массива, используйте по ссылке. Если вы хотите полностью удалить элементы массива, разбейте пары ключ / значение.

$arrayOne = array('example', 'listing of', 'stuff');

foreach ($arrayOne as $key => &$value) {
    $value .= ' alteration';

    if ($value == 'listing of alteration') {
        unset($arrayOne[ $key ]);
    }

}

Приведенный выше код добавит текст «изменение» в конец каждого элемента в массиве. Он также удалит второй индекс, когда он будет соответствовать «списку изменений». Проверено на PHP 5.2

1 голос
/ 23 октября 2008

Кролик имеет правильный ответ для использования ссылок для редактирования значений и индекса для сброса в цикле foreach (я бы проголосовал за вас, но это мой первый пост, поэтому у меня еще нет 15 представителей, извините)

Не забудьте использовать ссылку, если вы передадите ее функции, которая также должна отредактировать значение. Вам также нужно будет передать массив в качестве ссылки, если он удалит из него значение.

Я бы порекомендовал сделать функцию, возвращающую логическое значение, удалять ли, чтобы предотвратить создание дополнительных ссылок. например,

foreach ($array AS $key => &$value) {
    //& reference only needed if execFunction must edit $value
    if (execFunction(&$value)) { 
        unset($array[$key]);
    } else {
        $value['exec_failed']+=1;
    }
}
unset($value);

также ссылка на $ value останется за рамками цикла, таким образом, завершающий неустановленный.

Последняя мысль, звучало так, как будто вы хотели перебрать массив несколько раз. Обязательно обратите внимание на то, как перестает выполняться ваш цикл.

1 голос
/ 23 октября 2008

я бы порекомендовал иметь два массива,
один с данными - dataarray,
другой изначально пустой - emptyarray
и что бы ни относилось к первому циклу foreach, вставьте второй массив и, в конце этого, очистите первый массив, поменяйте местами идентификаторы двух массивов (dataarray станет emptyarray и наоборот) и повторяйте, пока не вернете false или что-то еще

0 голосов
/ 23 октября 2008

Спасибо всем за помощь. В конце концов, функция unset () - это то, что мне пригодится в сегодняшних конкретных потребностях. Вот краткий рассказ о моем использовании unset ():

//array to be processed
$one=array('1','2','3');
//array of terms previously defined as a group to compare against
$against=array('1','2');

foreach($one as $key=>$value){

    //pull out matching terms   
    $match=array_intersect($one,$against);
    //my need is to sum grouped numbers
    $sum=array_sum($match);
    echo $sum."<br />";

    //remove matching terms from original array
    foreach($match as $key=>$value){
        unset($one[$key]);
    }
}
//now a parent looping function will process the remaining array elements. In this case, the only one left is '3'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...