PHP Array_filter на & quot; простой & quot; многоуровневый массив

Могу ли я и как я могу использовать PHP array_filter отфильтровать пустые / пустые записи из следующей структуры массива?

От: Массив взят из вызова PDO с использованием Fetch BOTH, поэтому числовые и именованные значения всегда равны в этом случае.

Array
(
[2400] => Array
(
[0] => Array
(
[value] => 7
[0] => 7
)
[1] => Array
(
[value] => 61
[0] => 61
)
[2] => Array
(
[value] => 42
[0] => 42
)
[3] => Array
(
[value] =>
[0] =>
)
)
)

Для того, чтобы:

Array
(
[2400] => Array
(
[0] => Array
(
[value] => 7
[0] => 7
)
[1] => Array
(
[value] => 61
[0] => 61
)
[2] => Array
(
[value] => 42
[0] => 42
)
)
)

я пытался

  • старый добрый array_filter
  • array_filter(array, function($f){ ??? }) и не совсем уверен, куда идти отсюда … Я собирался создать массив, чтобы вникать в него, но как это повлияет на записи через array_filter? Не принесет ли верный / ложный возврат всю часть массива [2400]? Это просто смутило меня.

Пожалуйста, предложите улучшения для вопроса

1

Решение

Я думаю, что это не может быть сделано с помощью только array_filter функция, потому что иногда вам нужно изменить элементы массива, кроме array_filter Функция позволяет только решить, должен ли элемент быть исключен или нет.

Например, в основной массив элемент с индексом 2400 должен быть включен в набор результатов, но его содержимое должно быть изменено.

Я написал для этого простую функцию, надеюсь, она поможет. Ну, вы можете использовать это для вдохновения. И это был интересный вызов для меня.

Ниже моя функция с парой тестов.

<?php

function deepFilter(array $array)
{
// Formally this is not need because if array is empty then $filteredArray will also be empty
// but it simplifies the algorithm
if (empty($array)) {
return [];
}

$filteredArray = [];
foreach ($array as $key => $value) {
if (is_array($value) && !empty($value)) {
$value = deepFilter($value);
}
if (!empty($value)) {
$filteredArray[$key] = $value;
}
}

return $filteredArray;
}

$testArray1 = [
2400 => [
0 => [
'value' => 7,
0 => 7,
],
1 => [
'value' => 61,
0 => 61,
],
2 => [
'value' => 42,
0 => 42,
],
3 => [
'value' => null,
0 => null,
]
]
];

$testArray2 = [
2400 => [
0 => [
'value' => 7,
0 => 7,
],
1 => [
'value' => 61,
0 => 61,
],
2 => [
'value' => 42,
0 => 42,
],
3 => null
],
3243 => [
0 => [
'value' => 7,
0 => null,
],
1 => [
'value' => null,
0 => 61,
],
2 => [
'value' => 42,
0 => 42,
],
3 => null
]
];
var_export(deepFilter($testArray1));
var_export(deepFilter($testArray2));

Идея очень проста.

  1. Возьмите массив и проверьте элементы один за другим.
  2. Если элемент является массивом, примените функцию для этого элемента и проверьте результат. Мы можем удалить все из дочернего массива, и в этом случае мы не должны добавлять его в результаты. Иначе, если у ребенка осталось что-то после очистки, включите «очищенный ребенок» в наш набор результатов.
  3. Если наш элемент не является массивом, включайте его, только если он не пустой.

Пожалуйста, дайте мне знать, если вы найдете какие-либо ошибки или это работает для вас или нет.

2

Другие решения

использование array_filter и проверить value элемент (или 0 элемент, так как они эквивалентны).

$array[2400] = array_filter($array[2400], function($element) {
return $element['value'];
});

Чтобы сделать это для всех элементов внешнего массива, используйте foreach петля.

foreach ($array as &$subarray) {
$subarray = array_filter($subarray, function($element) {
return $element['value'];
});
}

или же array_map:

$array = array_map(function($subarray) {
return array_filter($subarray, function($element) {
return $element['value'];
});
}, $array);
2

Если структура массива остается прежней, это должно работать:

foreach ($array as &$innerArray) {
$innerArray = array_filter($innerArray, function($arr) {
return (!empty($arr[0]));
});
}
unset($innerArray);
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector