Мне нужно удалить пустые записи на многоуровневых массивах. На данный момент я могу удалить записи с пустыми подмассивами, но не пустые массивы … смущен, так что я … Я думаю, что код поможет лучше объяснить …
<?php /** * * This function remove empty entries on arrays * @param array $array */ function removeEmptysFromArray($array) { $filtered = array_filter($array, 'removeEmptyItems'); return $filtered; } /** * * This is a Callback function to use in array_filter() * @param array $item */ function removeEmptyItems($item) { if (is_array($item)) { return array_filter($item, 'removeEmptyItems'); } if (!empty($item)) { return true; } } $raw = array( 'firstname' => 'Foo', 'lastname' => 'Bar', 'nickname' => '', 'birthdate' => array( 'day' => '', 'month' => '', 'year' => '', ), 'likes' => array( 'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 'bikes' => array(), ), ); print_r(removeEmptysFromArray($raw)); ?>
Хорошо, этот код удалит «nickname», «birthdate», но не удаляет «байки», у которых есть пустой массив.
Мой вопрос … Как удалить запись «велосипеды»?
С наилучшими пожеланиями,
Извините за мой английский…
Попробуйте этот код:
<?php function array_remove_empty($haystack) { foreach ($haystack as $key => $value) { if (is_array($value)) { $haystack[$key] = array_remove_empty($haystack[$key]); } if (empty($haystack[$key])) { unset($haystack[$key]); } } return $haystack; } $raw = array( 'firstname' => 'Foo', 'lastname' => 'Bar', 'nickname' => '', 'birthdate' => array( 'day' => '', 'month' => '', 'year' => '', ), 'likes' => array( 'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 'bikes' => array(), ), ); print_r(array_remove_empty($raw));
с<?php function array_remove_empty($haystack) { foreach ($haystack as $key => $value) { if (is_array($value)) { $haystack[$key] = array_remove_empty($haystack[$key]); } if (empty($haystack[$key])) { unset($haystack[$key]); } } return $haystack; } $raw = array( 'firstname' => 'Foo', 'lastname' => 'Bar', 'nickname' => '', 'birthdate' => array( 'day' => '', 'month' => '', 'year' => '', ), 'likes' => array( 'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 'bikes' => array(), ), ); print_r(array_remove_empty($raw));
Я думаю, что это должно решить вашу проблему.
$retArray =array_filter($array, arrayFilter); function arrayFilter($array) { if(!empty($array)) { return array_filter($array); } }
Вот мое решение, оно рекурсивно удалит точно указанный список пустых значений:
/** * Remove elements from array by exact values list recursively * * @param array $haystack * @param array $values * * @return array */ function array_remove_by_values(array $haystack, array $values) { foreach ($haystack as $key => $value) { if (is_array($value)) { $haystack[$key] = array_remove_by_values($haystack[$key], $values); } if (in_array($haystack[$key], $values, true)) { unset($haystack[$key]); } } return $haystack; }
с/** * Remove elements from array by exact values list recursively * * @param array $haystack * @param array $values * * @return array */ function array_remove_by_values(array $haystack, array $values) { foreach ($haystack as $key => $value) { if (is_array($value)) { $haystack[$key] = array_remove_by_values($haystack[$key], $values); } if (in_array($haystack[$key], $values, true)) { unset($haystack[$key]); } } return $haystack; }
Вы можете использовать его следующим образом:
$clean = array_remove_by_values($raw, ['', null, []]);
Обратите внимание: он удаляет пустые вспомогательные массивы, если вы передаете []
качестве одного из значений.
Если вы хотите, чтобы array_filter работал рекурсивно, вам нужно убедиться, что последующие вызовы могут редактировать более глубокие вложенные элементы массива. Короче: вам нужно передать его по ссылке:
function removeEmptyItems(&$item) { if (is_array($item) && $item) { $item = array_filter(&$item, 'removeEmptyItems'); } return !!$item; }