Я ужасен с манипулированием массивами … учитывая эту структуру, я хочу удалить массив верхнего уровня и объединить все подмножества в один плоский массив:
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 )
Скорость важна – мы будем иметь дело с сотнями тысяч результатов
Вы можете использовать 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)
См. Простой демонстрационный пример
$flat = call_user_func_array('array_merge', $arr);
Это сгладит массив на ровно один уровень . Он возьмет образец ввода, который вы предоставили, и произведет желаемый результат, который вы попросили.
Убедиться
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's like: array_merge($arr[0], $arr[1], $arr[2]); // and so on...
Если вы используете php 5.6+, оператор splat ( ...
) может быть более читаемым способом:
$flat = array_merge(...$arr);
<?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>"; ?>
Я не знаю, как получить такой аррал, но это решение получает только значения.
[отредактировано] Im sorry, его самый сладкий:
function deepValues(array $array, array &$values) { foreach($array as $level) { if (is_array($level)) { deepValues($level, $values); } else { $values[] = $level; } } }
Если ваши массивы всегда имеют одинаковую ранее известную глубину, возможно, вы можете хорошо использовать
Если массив имеет только один уровень от ассоциативного индекса и только с одним элементом:
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 ) )
Если значения всегда находятся на одном уровне глубины, вы действительно можете использовать 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 )