У меня есть этот массив:
$aryMain = array(array('hello','bye'), array('',''),array('',''));
Он формируется путем чтения файла csv, а массив ('', '') – это пустые строки в конце файла.
Как я могу их удалить?
Я пробовал:
$aryMain = array_filter($aryMain);
Но это не работает 🙁
Большое спасибо!
Чтобы добавить к ответу Рикеша:
<?php $aryMain = array(array('hello','bye'), array('',''),array('','')); $aryMain = array_filter(array_map('array_filter', $aryMain)); print_r($aryMain); ?>
Приклеивание его кода в другой файл array_filter избавится от всех массивов.
Array ( [0] => Array ( [0] => hello [1] => bye ) )
В сравнении с:
$aryMain = array_map('array_filter', $aryMain); Array ( [0] => Array ( [0] => hello [1] => bye ) [1] => Array ( ) [2] => Array ( ) )
Используйте array_map вместе с array_filter,
$array = array_filter(array_map('array_filter', $array));
Или просто создайте функцию array_filter_recursive
function array_filter_recursive($input) { foreach ($input as &$value) { if (is_array($value)) { $value = array_filter_recursive($value); } } return array_filter($input); }
DEMO.
Обратите внимание: это приведет к удалению элементов, содержащих «0» (т.е. строку с нулевой цифрой). Просто передайте 'strlen'
в качестве второго параметра, чтобы сохранить 0
Примените array_filter()
к основному массиву, а затем еще раз о внутренних элементах:
$aryMain = array_filter($aryMain, function($item) { return array_filter($item, 'strlen'); });
Внутренний array_filter()
специально использует strlen()
чтобы определить, является ли элемент пустым; иначе он удалит '0'
.
Чтобы определить пустоту массива, вы также можете использовать array_reduce()
:
array_filter($aryMain, function($item) { return array_reduce($item, function(&$res, $item) { return $res + strlen($item); }, 0); });
Является ли это более эффективным, спорным, но он должен сэкономить память 🙂