фильтр массива преобразование индексированного массива в ассоциативный массив


У меня есть индексированный массив, который содержит несколько ассоциативных массивов, и я применяю простой

$my_arr = array_filter($my_arr, function($obj) {
    return $obj["value"] < 100;
});

Функция для фильтрации некоторых элементов в массиве.

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

  • является ли это ожидаемым поведением в array_filter?
  • Как я могу сказать array_filter, что мне нужен индексированный массив?

Правка: как запрошенный в комментариях, мой $my_arr:

$my_arr = [
    ["foo" => "bar", "value" => 10],
    ["foo" => "var", "value" => 30],
    ["foo" => "car", "value" => 440],
    ["foo" => "dar", "value" => 700]
]

EDIT: Real-world извлечение из моего кода:

$media = [
    "photos" => [
        ["foo" => "bar", "value" => 10],
        ["foo" => "var", "value" => 20],
        ["foo" => "car", "value" => 50],
    ]
];

echo json_encode($media);
echo "nn";

$media["photos"] = array_filter($media["photos"], function($photo) {
    return $photo["value"] > 15;
});

echo json_encode($media); 

вывод:

{"photos":[{"foo":"bar","value":10},{"foo":"var","value":20},{"foo":"car","value":50}]}

{"photos":{"1":{"foo":"var","value":20},"2":{"foo":"car","value":50}}}

ожидаемый результат:

{"photos":[{"foo":"bar","value":10},{"foo":"var","value":20},{"foo":"car","value":50}]}

{"photos":[{"foo":"var","value":20},{"foo":"car","value":50}]}
1 4

1 ответ:

Массив не преобразуется из одного типа в другой - это одно и то же в PHP. Просто array_filter() сохраняет ассоциации ключ / значение при фильтрации. Автоматически переиндексировать массив в соответствии с документацией невозможно, поэтому вам придется сделать это вручную:

$my_arr = array_values(array_filter($my_arr, function($obj) {
    return $obj["value"] < 100;
}));