Сбросить ключ массива, если все дочерние значения массива пусты

У меня есть массив со следующей структурой:

array(
    "0" => array(
        "0" => array(
            '0' => array('value' => 'value'),
            '1' => array('value' => ''),
            '2' => array('value' => ''),
        ),
        "1" => array(
            '0' => array('value' => 'abc'),
            '1' => array('value' => 'lorem'),
            '2' => array('value' => ''),
        )
    ),
    "1" => array(
        "0" => array(
            '0' => array('value' => ''),
            '1' => array('value' => 'hgjklo'),
            '2' => array('value' => ''),
        ),
        "1" => array(
            '0' => array('value' => 'abcdef'),
            '1' => array('value' => 'value'),
            '2' => array('value' => ''),
        )
    ),
)

и то, что я пытаюсь сделать, это удалить все ключи для пустого значения, но только если значение пусто во всех* дочерних массивах внутри основного массива.

Ожидаемый результат:

array(
    "0" => array(
        "0" => array(
            '0' => array('value' => 'value'),
            '1' => array('value' => ''),
        ),
        "1" => array(
            '0' => array('value' => 'abc'),
            '1' => array('value' => 'lorem'),
        )
    ),
    "1" => array(
        "0" => array(
            '0' => array('value' => ''),
            '1' => array('value' => 'hgjklo'),
        ),
        "1" => array(
            '0' => array('value' => 'abcdef'),
            '1' => array('value' => 'value'),
        )
    ),
)

ПРИМЕЧАНИЕ: позиция 2 дочернего массива была удалена, поскольку она была пустой во всех позициях основного массива.

У кого-нибудь есть отличная идея, как это можно сделать без сложной логики foreach?


person zppinto    schedule 29.09.2020    source источник
comment
Это похоже на работу не с массивом массивов, а с правильной структурой данных?   -  person Mike 'Pomax' Kamermans    schedule 29.09.2020
comment
К сожалению, я не могу пойти по этому пути... Мне действительно нужно использовать массивы.   -  person zppinto    schedule 29.09.2020
comment
Вы пробовали что-нибудь? Есть код? Такое чувство, будто я делаю твою домашнюю работу.   -  person ficuscr    schedule 29.09.2020
comment
Да, я пробовал много foreach, но код стал нечитаемым. Поэтому я искал любую идею с array_filter или что-то в этом роде.   -  person zppinto    schedule 29.09.2020
comment
Означает ли ваша задача, что все массивы на самом глубоком уровне имеют одинаковый размер?   -  person Anton    schedule 29.09.2020
comment
Да @Anton , но на самом глубоком уровне, кроме значения, ключа у меня есть другие ключи, но размер ключей во всех них одинаков.   -  person zppinto    schedule 30.09.2020
comment
Пустое значение всегда является последним в самом глубоком массиве? Или это может быть по индексу 0 например?   -  person Anton    schedule 30.09.2020
comment
Да, это всегда последнее, в данном конкретном случае значение ключа. Индекс 0, 1, 2 и т. д. не может быть пустым! Все они следуют одной и той же структуре, поэтому единственные изменения всегда будут на самом глубоком уровне массива!   -  person zppinto    schedule 30.09.2020
comment
Yes, I've tried with a lot of foreach's, but the code became "unredable" Покажите нам код.   -  person Anton    schedule 30.09.2020


Ответы (1)


Как уже говорилось, структура данных бесполезна. Я согласен, что array_ функции, как правило, хороши, но они лучше работают со структурами, которые имеют смысл.

Если, например, вы удалили немного бесполезного мусора, чтобы получить массив, подобный следующему:

$foo = array(
    "0" => array(
        "0" => array(
            '0' => 'value',
            '1' => '',
            '2' => '',
        ),
        "1" => array(
            '0' => 'abc',
            '1' => 'lorem',
            '2' => '',
        )
    ),
    "1" => array(
        "0" => array(
            '0' =>  '',
            '1' => 'hgjklo',
            '2' => ''
        ),
        "1" => array(
            '0' => 'abcdef',
            '1' => 'value',
            '2' => ''
        )
    ),
);

Затем вы можете сделать что-то вроде:

<?php
$uids = array_fill_keys(array_keys($foo[0][0]), 0);

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($foo));
foreach($it as $k =>$v) {
  if (!empty($v)) $uids[$k]++;
}
var_dump($uids);

/*
The value here shows the number of non empty values in the set per key.
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(3)
  [2]=>
  int(0)
}

Очистите массив больше, и это станет проще.

person ficuscr    schedule 29.09.2020
comment
Спасибо за ваш ответ. Действительно, это может быть решением, но помимо значения ключа у меня есть другие ключи, и массив не может быть уменьшен, как в вашем примере. - person zppinto; 30.09.2020