[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Очищаем многомерный массив
Страницы: 1, 2
Kusss
Я ничего не упустил ?
// Очищаем многомерный массив от пустых значений
function deleteEmpty($myArray ) {
$retArray= Array();
foreach($myArray as $key=>$val) {
if ($val<>'') {
if (is_array($val))
$retArray[$key] = deleteEmpty($val);
else
$retArray[$key] = $val;
}
}

return $retArray;
}
Dezigo
Сначала проверти это массив или нет, а потом пустая ли ячейка, а не наоборот.

foreach($myArray as $key=>$val) {
if ($val<>'') {
if (is_array($val))
$retArray[$key] = deleteEmpty($val);
else
$retArray[$key] = $val;
}
}


Этого я не понел.
$retArray[$key] = $val;

Зачем?
Kusss
Цитата
Зачем?

Записать не пустое значение.

// Очищаем многомерный массив от пустых значений
function deleteEmpty($myArray ) {
$retArray= Array();
foreach($myArray as $key=>$val) {
if (is_array($val))
$retArray[$key] = deleteEmpty($val);
else {
if ($val<>'')
$retArray[$key] = $val;
}
}

return $retArray;
}



Dezigo
Я бы так сделал

function clean(&$array)
{
foreach ($array as $key => &$value) {
if (is_array($value)) {
clean($value);
}
if (empty($value)) {
unset($array[$key]);
}
}
}



$array = array(
array('A' => 123, 'B' => ''),
'',
45,
array('C' => array('D' => '')),
);


clean($array);
print_r($array);


Ответ
Array ( [0] => Array ( [A] => 123 ) [2] => 45 )
Kusss
нули то зачем убивать ?
Dezigo
Да, если не нужно убивать нули, то как вы написали
if ($value == '')
kristall

function array_filter_recursive($myArray)
{
foreach ($myArray as &$value){
if (is_array($value))
$value = array_filter_recursive($value);
}
return array_filter($myArray);
}

http://php.net/manual/ru/function.array-filter.php

_____________
echo '<pre>',print_r($var, 1);die;

root@server# make love && war
Kusss
я сегодня туплю.
а зачем "&" в коде ?
kristall
Чтобы не создавать копию массива, сразу работаем с элементами оригинального по ссылке.

_____________
echo '<pre>',print_r($var, 1);die;

root@server# make love && war
Dezigo
Как вы написали тоже будет работать если сменить условие как я написал ввыше, просто есть способ передать массив по ссылке особенно когда это рекурсия.
Kusss
Спасибо за разъяснения.
mvg
Цитата (Kusss @ 20.01.2015 - 13:26)
я сегодня туплю.
а зачем "&" в коде ?

в приведенной ссылке & бинарное и что приводит к битовым смещениям. Подробнее см. битовые опрации.
volter9
kristall

У тебя функция ошибку выдает, ты забыл замыкание ей передать:

function array_filter_recursive($myArray) {
foreach ($myArray as &$value){
if (is_array($value)) {
$value = array_filter_recursive($value);
}
}


return array_filter($myArray, function ($value) {
return $value === null || !empty($value);
});
}


Kusss

Решение на основе данных Dezigo (+ несколько null'ов) и функции kristall (с добавленным замыканием):

$array = array(
array(
'A' => 123,
'B' => ''
),
'',
45,
array(
'C' => array(
'D' => ''
)
),

null,
null
);

function array_filter_recursive($myArray) {
foreach ($myArray as &$value){
if (is_array($value)) {
$value = array_filter_recursive($value);
}
}


return array_filter($myArray, function ($value) {
return $value === null || !empty($value);
});
}

var_dump(array_filter_recursive($array));


Вывод:

array(4) {
[0] =>array(1) {
'A' =>int(123)
}
[2] =>int(45)
[4] =>NULL
[5] =>NULL
}


Можешь обвернуть в array_values(array_filter_recursive($array)) что бы обнулить ключи.

_____________
Мой блог
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.