Intereting Posts

PHP – Как удалить пустые записи массива рекурсивно?

Мне нужно удалить пустые записи на многоуровневых массивах. На данный момент я могу удалить записи с пустыми подмассивами, но не пустые массивы … смущен, так что я … Я думаю, что код поможет лучше объяснить …

<?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», но не удаляет «байки», у которых есть пустой массив.

Мой вопрос … Как удалить запись «велосипеды»?

С наилучшими пожеланиями,

Извините за мой английский…

Solutions Collecting From Web of "PHP – Как удалить пустые записи массива рекурсивно?"

Попробуйте этот код:

 <?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; }