#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. Спасибо за ваш ответ. Действительно, это может быть решением, но помимо ключа «значение» у меня есть другие ключи, и массив нельзя уменьшить, как в вашем примере.