Замена массива в цикле foreach массивом, измененным в том же цикле

StackOverflow https://stackoverflow.com/questions/229491

  •  04-07-2019
  •  | 
  •  

Вопрос

foreach($arrayOne as $value){
    do function
}

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

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

Это было полезно?

Решение

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

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

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

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

}

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

Другие советы

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

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

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

У Rabbit есть правильный ответ для использования ссылок для редактирования значений и отмены индексирования в цикле 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);

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

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

Спасибо всем за их помощь.Функция 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'.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top