Добрый день. Есть один большой массив массивов (количество последних не ограничено): Код (Text): [0] => Array ( [0] => Наименование [1] => Размер, мм [2] => Ширина, мм [3] => Марка [4] => Диаметр, мм [5] => Длина, мм ) [1] => Array ( [0] => Профнастил окрашен. 9002 Н114 оцинкованный [1] => [2] => 0.9 [3] => 2 [4] => [5] => ) [2] => Array ( [0] => Профнастил С21 оцинкованный [1] => 1 [2] => 0.5 [3] => [4] => [5] => ) Нужно удалить элементы, которые пустые во всех массивах с исключением из расчётов первого. Должно получиться вот так: Код (Text): [0] => Array ( [0] => Наименование [1] => Размер, мм [2] => Ширина, мм [3] => Марка ) [1] => Array ( [0] => Профнастил окрашен. 9002 Н114 оцинкованный [1] => [2] => 0.9 [3] => 2 ) [2] => Array ( [0] => Профнастил С21 оцинкованный [1] => 1 [2] => 0.5 [3] => )
array_map с array_filter --- Добавлено --- можно и с 2 foreach где проверяем на пустоту и просто чистим элементы дочернего массива
@Yankovitz, прежде чем закрывать тему, не плохо было бы показать результат. --- Добавлено --- @artoodetoo, удалить пустые которые пустые во всех массивах исключая первый.
Я понял если $array исходный массив, то вот так: PHP: $body = $array; // cut first row, get keys (non-numeric keys are accepted) $keys = array_keys(array_shift($body)); $lengths = []; // find total length of each column element foreach ($body as $r) { foreach ($keys as $k) { $lengths[$k] += strlen($r[$k]); } } // remove empty columns foreach ($array as &$r) { foreach ($keys as $k) { if ($lengths[$k] == 0) { unset($r[$k]); } } } unset($r); // just in case :) ключи на втором уровне вложенности не обязательно должны быть числами. если это имена полей, например, тоже прокатит. не учитывается выроженный случай, когда в массиве только строка с заголовками. не знаю что нужно при таком раскладе, то ли удалять всё, то ли не делать ничего )))
PHP Notice: Undefined offset: 0 1 2 3 4 5 В $body 3 элемента сравнивается с 5 ключами подмассива, оно работает но это не так как нужно .....
Я исходил из того, что ключи одни и те же в строке заголовка и в рядах данных. Помоему вполне естественное предположение. Но похоже вы создали иной входной массив. То ли с разными ключами, то ли с рядами разной длинны. --- Добавлено --- Я также написал, что с пустым массивом данных это не работает. --- Добавлено --- Я не понимаю что вы имеете в виду ну допустим 3 ряда * 5 элементов и что? --- Добавлено --- Короче, @keren, есть ощущение, что вы работаете с говёными исходными данными. Не могли бы вы скопировать из сюда.
Это массив: PHP: $array = array ( 0 => array ( 0 => 'Наименование', 1 => 'Размер, мм', 2 => 'Ширина, мм', 3 => 'Марка', 4 => 'Диаметр, мм', 5 => 'Длина, мм', ), 1 => array ( 0 => 'Профнастил окрашен. 9002 Н114 оцинкованный', 1 => '', 2 => 0.9, 3 => 2, 4 => '', 5 => '', ), 2 => array ( 0 => 'Профнастил С21 оцинкованный', 1 => 1, 2 => 0.5, 3 => '', 4 => '', 5 => '', ) ); Переписал так: PHP: foreach ($body as $r) { foreach ($r as $k => $v) { $lengths[$k] += strlen($v); } } Выводит тоже самое с нотисами ...