php: array_filter внутри цикла возвращает массив с другим индексом

У меня есть этот код:

$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

person SlimenTN    schedule 08.05.2019    source источник
comment
... Array keys are preserved см. руководство: php.net/manual/en/function. массив-filter.php   -  person jeroen    schedule 08.05.2019
comment
С чего вы взяли, что результат должен быть другим?   -  person Nico Haase    schedule 08.05.2019
comment
@NicoHaase, потому что каждый раз, когда я зацикливаюсь, я получаю новый массив на основе условия, $filtered = array_filter(...) $filtered всегда получает новое значение правильно ?!   -  person SlimenTN    schedule 08.05.2019
comment
@jeroen, зачем их сохранять?! когда я фильтрую, я ожидаю получить совершенно новый массив!   -  person SlimenTN    schedule 08.05.2019
comment
why should they be preserved? Потому что это то, что делает функция и как это описано в руководстве?   -  person jeroen    schedule 08.05.2019
comment
Зачем менять ключи, удаляя что-то из массива? Как и текстовые клавиши, цифровые клавиши не изменяются фильтрацией.   -  person Nico Haase    schedule 08.05.2019
comment
@NicoHaase Я думаю, что имеет смысл получить массив с новыми ключами, потому что, когда я использую array_filter, я ожидаю получить совершенно новый массив, вот и все. Но, подумав, я думаю, что лучше сохранить ключи, потому что в PHP у нас могут быть массивы с определенными ключами (например, строки), и они нам нужны даже после фильтрации, поэтому я думаю, именно поэтому они сохраняют ключи.   -  person SlimenTN    schedule 08.05.2019
comment
@jeroen чувак, я знаю, что это то, что делает функция, для этого должна быть веская причина, ты так не думаешь?   -  person SlimenTN    schedule 08.05.2019
comment
Я думаю, причина довольно проста: ключи есть ключи, независимо от того, являются ли они числами или строковыми значениями. И полагаться на тот факт, что элементы каким-либо образом пронумерованы, неправильно с самого начала, ключи предназначены не для этого.   -  person Nico Haase    schedule 08.05.2019


Ответы (1)


Просто оберните 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);
}

ДЕМО: https://3v4l.org/X1iSF

person Always Sunny    schedule 08.05.2019
comment
хорошо, это работает, но у вас есть объяснение этому? потому что, когда у вас есть больший массив, я думаю, что это решение вызовет проблемы с производительностью, я прав? - person SlimenTN; 08.05.2019
comment
@SlimenTN Да Согласен. Посмотрите здесь stackoverflow.com/a/43657546/1138192 - person Always Sunny; 08.05.2019
comment
Спасибо за ваш ответ и ваше время :) - person SlimenTN; 08.05.2019
comment
Наверняка это не ответ на вопрос (почему...). Это в лучшем случае дубликат. Комментарий от @jeroen - правильный ответ на вопрос. - person jibsteroos; 08.05.2019
comment
@jibsteroos да, но я тоже искал решение для этого :) - person SlimenTN; 08.05.2019