У меня есть этот код:
$array = [0, 1, 2];
for($i = 0; $i <= 2; $i++){
$filtered = array_filter($array, function($elem) use ($i){
return ($elem == $i);
});
var_dump($filtered);
}
Результат следующий:
array (size=1)
0 => 0
array (size=1)
1 => 1
array (size=1)
2 => 2
Мой вопрос в том, почему я получаю другой индекс для результата $filtered ?!!
Результат должен быть таким:
array (size=1)
0 => 0
array (size=1)
0 => 1
array (size=1)
0 => 2
С чего вы взяли, что результат должен быть другим?
@NicoHaase, потому что каждый раз, когда я зацикливаюсь, я получаю новый массив на основе условия, $filtered = array_filter(...)$filtered всегда правильно получает новое значение ?!
@jeroen, зачем их сохранять?! когда я фильтрую, я ожидаю получить совершенно новый массив!
why should they be preserved? Потому что это то, что делает функция и как это описано в руководстве?
Зачем менять ключи, удаляя что-то из массива? Так же, как и «текстовые» клавиши, цифровые клавиши не изменяются фильтрацией.
@NicoHaase Я думаю, что имеет смысл получить массив с новыми ключами, потому что, когда я использую array_filter, я ожидаю получить совершенно новый массив, вот и все. Но, подумав, я думаю, что лучше сохранить ключи, потому что в PHP у нас могут быть массивы с определенными ключами (например, строки), и они нам нужны даже после фильтрации, поэтому я думаю, именно поэтому они сохраняют ключи.
@jeroen чувак, я знаю, что это то, что делает функция, для этого должна быть веская причина, ты так не думаешь?
Я думаю, причина довольно проста: ключи есть ключи, независимо от того, являются ли они числами или строковыми значениями. И полагаться на тот факт, что элементы каким-либо образом «пронумерованы», неправильно с самого начала, это не то, для чего нужны ключи.






Просто оберните array_filter()array_values(). Попробуем так-
<?php
$array = [0, 1, 2];
for($i = 0; $i <= 2; $i++){
$filtered = array_values(array_filter($array, function($elem) use ($i){
return ($elem == $i);
}));
var_dump($filtered);
}
хорошо, это работает, но у вас есть объяснение этому? потому что, когда у вас есть больший массив, я думаю, что это решение вызовет проблемы с производительностью, я прав?
@SlimenTN Да Согласен. Посмотрите здесь stackoverflow.com/a/43657546/1138192
Спасибо за ваш ответ и ваше время :)
Наверняка это не ответ на вопрос ("почему..."). Это в лучшем случае дубликат. Комментарий от @jeroen - правильный ответ на вопрос.
@jibsteroos да, но я тоже искал решение для этого :)
... Array keys are preserved, смотрите инструкцию: php.net/manual/en/function.array-filter.php