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

#php #arrays #array-filter

#php #массивы #массив-фильтр

Вопрос:

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

 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?

Комментарии:

1. Это похоже на работу «не для массива массивов», а для правильной структуры данных?

2. К сожалению, я не могу пойти по этому пути… Мне действительно нужно использовать массивы.

3. Вы что-нибудь пробовали? Есть какой-нибудь код? Похоже, я делаю вашу домашнюю работу.

4. Да, я пробовал со многими foreach, но код стал «недоступным для восстановления». Итак, я искал любую идею с array_filter или что-то в этом роде.

5. Означает ли ваша задача, что весь массив на самом глубоком уровне имеет одинаковый размер?

Ответ №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)
}

  

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

Комментарии:

1. Спасибо за ваш ответ. Действительно, это может быть решением, но помимо ключа «значение» у меня есть другие ключи, и массив нельзя уменьшить, как в вашем примере.