Php Извлеките массив родительского уровня из набора массивов и узлов объединения
Я ужасен с манипулированием массивами... учитывая эту структуру, я хочу удалить массив верхнего уровня и объединить все подмножества в один плоский массив:
Array
(
[0] => Array
(
[0] => Array
(
[0] => hey.com
)
[1] => Array
(
[0] => you.com
)
)
[1] => Array
(
[0] => Array
(
[0] => this.com
)
[1] => Array
(
[0] => rocks.com
)
)
)
в желаемую структуру:
Array
(
[0] => hey.com
[1] => you.com
[2] => this.com
[3] => rocks.com
)
Скорость важна - мы будем иметь дело с сотнями тысяч результатов.
Ответы
Ответ 1
Вы можете использовать RecursiveArrayIterator
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($data));
$list = iterator_to_array($it,false);
var_dump($list);
Выход
array (size=4)
0 => string 'hey.com' (length=7)
1 => string 'you.com' (length=7)
2 => string 'this.com' (length=8)
3 => string 'rocks.com' (length=9)
См. Простой демонстрационный пример
Ответ 2
$flat = call_user_func_array('array_merge', $arr);
Это сгладит массив с помощью ровно на один уровень. Он возьмет образец ввода, который вы предоставили, и произведет желаемый результат, который вы запросили.
Убедитесь, что
- ваш родительский массив использует числовые индексы
- родительский массив имеет хотя бы один дочерний элемент, иначе вы получите php-ошибку из-за
array_merge
жалобы на отсутствие аргументов.
Для тех, кто задается вопросом, как это работает:
// with
$arr = [ [1,2,3], [4,5,6] ];
// call_user_func_array('array_merge', $arr) is like calling
array_merge($arr[0], $arr[1]);
// and with
$arr = [ [1,2,3], [4,5,6], [7,8,9] ];
// then it like:
array_merge($arr[0], $arr[1], $arr[2]);
// and so on...
Если вы используете php 5.6+, оператор splat (...
) может быть более читаемым способом:
$flat = array_merge(...$arr);
Ответ 3
<?php
//Very simple recoursive solution
$array = array(
array(
array('hey.com'),
array('you.com')
),
array(
array('this.com'),
array('rocks.com'),
array(
array('its.com'),
array(
array('soo.com'),
array('deep.com')
)
)
)
);
function deepValues(array $array) {
$values = array();
foreach($array as $level) {
if (is_array($level)) {
$values = array_merge($values,deepValues($level));
} else {
$values[] = $level;
}
}
return $values;
}
$values = deepValues($array);
echo "<pre>";
print_r($values);
echo "</pre>";
?>
Я не знаю, как получить такой аррал, но это решение получает только значения.
[редактировать]
Мне жаль, его самый сладкий:
function deepValues(array $array, array &$values) {
foreach($array as $level) {
if (is_array($level)) {
deepValues($level, $values);
} else {
$values[] = $level;
}
}
}
Ответ 4
Если ваши массивы всегда имеют одинаковую ранее известную глубину, возможно, вы могли бы эффективно использовать
http://php.net/manual/es/function.array-merge.php
Ответ 5
Если массив имеет только один уровень из ассоциативного индекса и только с одним элементом:
foreach($arr as $key=>$val) {
if (is_array($arr[$key])) $arr[$key] = $arr[$key][0];
}
Getting:
[file] => Array (
[name] => black.png
[type] => image/png
[tmp_name] => /tmp/phpfupdU5
[error] => 0
[size] => 197782
)
from:
[file] => Array (
[name] => Array
( [0] => black.png )
[type] => Array
( [0] => image/png )
[tmp_name] => Array
( [0] => /tmp/phpfupdU5 )
[error] => Array
( [0] => 0 )
[size] => Array
( [0] => 197782 )
)
Ответ 6
Если значения всегда находятся на одном уровне с глубиной, вы действительно можете использовать array_merge:
$array = [
[
['hey.com'],
['you.com'],
],
[
['this.com'],
['rocks.com'],
],
];
print_r(array_merge(... array_merge(... $array)));
Getting:
Array
(
[0] => hey.com
[1] => you.com
[2] => this.com
[3] => rocks.com
)