Я перебираю массив объектов и хочу удалить один из объектов на основе его свойства id, но мой код не работает.
foreach($array as $element) {
foreach($element as $key => $value) {
if($key == 'id' && $value == 'searched_value'){
//delete this particular object from the $array
unset($element);//this doesn't work
unset($array,$element);//neither does this
}
}
}
Какие-либо предложения. Спасибо.
Ответы:
foreach($array as $elementKey => $element) { foreach($element as $valueKey => $value) { if($valueKey == 'id' && $value == 'searched_value'){ //delete this particular object from the $array unset($array[$elementKey]); } } }
источник
if(isset($element['id']) && $element['id'] == 'searched_value') { unset($array[$elementKey]); }
я думаю, в то время я просто скопировал и изменил его код, чтобы показать ему, какunset
правильно.Похоже, ваш синтаксис для unset неверен, и отсутствие переиндексации может вызвать проблемы в будущем. См .: раздел о массивах PHP .
Правильный синтаксис показан выше. Также помните о значениях массивов для переиндексации, чтобы никогда не индексировать то, что вы ранее удалили.
источник
Вы также можете использовать ссылки на
foreach
значения:foreach($array as $elementKey => &$element) { // $element is the same than &$array[$elementKey] if (isset($element['id']) and $element['id'] == 'searched_value') { unset($element); } }
источник
$element = null
НЕ будет работать, длина$array
останется прежней, он будет содержать только нулиЭто должно помочь ...
reset($array); while (list($elementKey, $element) = each($array)) { while (list($key, $value2) = each($element)) { if($key == 'id' && $value == 'searched_value') { unset($array[$elementKey]); } } }
источник
Будьте осторожны с основным ответом.
с участием
[['id'=>1,'cat'=>'vip'] ,['id'=>2,'cat'=>'vip'] ,['id'=>3,'cat'=>'normal']
и вызывая функцию
foreach($array as $elementKey => $element) { foreach($element as $valueKey => $value) { if($valueKey == 'cat' && $value == 'vip'){ //delete this particular object from the $array unset($array[$elementKey]); } } }
он возвращается
[2=>['id'=>3,'cat'=>'normal']
вместо того
[0=>['id'=>3,'cat'=>'normal']
Это потому, что unset не переиндексирует массив.
Он переиндексирует. (если нам это нужно)
$result=[]; foreach($array as $elementKey => $element) { foreach($element as $valueKey => $value) { $found=false; if($valueKey === 'cat' && $value === 'vip'){ $found=true; $break; } if(!$found) { $result[]=$element; } } }
источник
Я не особо разбираюсь в php-программировании, но могу сказать, что в C # вы не можете изменять массив во время итерации по нему. Вы можете попробовать использовать цикл foreach для определения индекса элемента или элементов, которые нужно удалить, а затем удалить элементы после цикла.
источник