Могу ли я и как я могу использовать 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]? Это просто смутило меня.Пожалуйста, предложите улучшения для вопроса
Я думаю, что это не может быть сделано с помощью только 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));
Идея очень проста.
Пожалуйста, дайте мне знать, если вы найдете какие-либо ошибки или это работает для вас или нет.
использование 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);
Если структура массива остается прежней, это должно работать:
foreach ($array as &$innerArray) {
$innerArray = array_filter($innerArray, function($arr) {
return (!empty($arr[0]));
});
}
unset($innerArray);