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
... Array keys are preserved, смотрите инструкцию: php.net/manual/en/function.array-filter.php
jeroen 08.05.2019 12:06

С чего вы взяли, что результат должен быть другим?

Nico Haase 08.05.2019 12:17

@NicoHaase, потому что каждый раз, когда я зацикливаюсь, я получаю новый массив на основе условия, $filtered = array_filter(...)$filtered всегда правильно получает новое значение ?!

SlimenTN 08.05.2019 12:28

@jeroen, зачем их сохранять?! когда я фильтрую, я ожидаю получить совершенно новый массив!

SlimenTN 08.05.2019 12:31
why should they be preserved? Потому что это то, что делает функция и как это описано в руководстве?
jeroen 08.05.2019 12:50

Зачем менять ключи, удаляя что-то из массива? Так же, как и «текстовые» клавиши, цифровые клавиши не изменяются фильтрацией.

Nico Haase 08.05.2019 12:50

@NicoHaase Я думаю, что имеет смысл получить массив с новыми ключами, потому что, когда я использую array_filter, я ожидаю получить совершенно новый массив, вот и все. Но, подумав, я думаю, что лучше сохранить ключи, потому что в PHP у нас могут быть массивы с определенными ключами (например, строки), и они нам нужны даже после фильтрации, поэтому я думаю, именно поэтому они сохраняют ключи.

SlimenTN 08.05.2019 14:47

@jeroen чувак, я знаю, что это то, что делает функция, для этого должна быть веская причина, ты так не думаешь?

SlimenTN 08.05.2019 14:49

Я думаю, причина довольно проста: ключи есть ключи, независимо от того, являются ли они числами или строковыми значениями. И полагаться на тот факт, что элементы каким-либо образом «пронумерованы», неправильно с самого начала, это не то, для чего нужны ключи.

Nico Haase 08.05.2019 15:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
9
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

хорошо, это работает, но у вас есть объяснение этому? потому что, когда у вас есть больший массив, я думаю, что это решение вызовет проблемы с производительностью, я прав?

SlimenTN 08.05.2019 11:57

@SlimenTN Да Согласен. Посмотрите здесь stackoverflow.com/a/43657546/1138192

Always Sunny 08.05.2019 12:02

Спасибо за ваш ответ и ваше время :)

SlimenTN 08.05.2019 12:16

Наверняка это не ответ на вопрос ("почему..."). Это в лучшем случае дубликат. Комментарий от @jeroen - правильный ответ на вопрос.

jibsteroos 08.05.2019 12:27

@jibsteroos да, но я тоже искал решение для этого :)

SlimenTN 08.05.2019 12:32

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