16

私は配列を操作するのがひどいです...この構造を考えると、トップレベルの配列を削除し、すべてのサブセットを1つのフラットな配列にマージしたい:

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
    )

スピードは不可欠です - 何十万件もの結果を処理します

4

6 に答える 6

30
$flat = call_user_func_array('array_merge', $arr);

これにより、配列が正確に 1 レベル平坦化されます。提供されたサンプル入力を受け取り、要求した目的の出力を生成します。

*注 - この回答が投稿された後に質問が編集されました。質問は、以前に次の望ましい結果を要求しました。

Array
(
    [0] => Array
        (
            [0] => hey.com
            [1] => you.com
            [2] => this.com
            [3] => rocks.com
        )

)

これは、上記のarray_merge()回答が提供するものです。

確実に:

  1. 親配列は数値インデックスを使用しています
  2. 親配列には少なくとも 1 つの子要素があります。そうしarray_mergeないと、引数がないと文句を言って PHP エラーが発生します。

それがどのように機能するのか疑問に思っている人のために:

// 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);

複数のレベルでフラット化する場合は、複数のネストされたarray_merge()呼び出しを使用するか、構造を再帰的に完全にフラット化する必要があります。

// This is a great option if you don't know what depth the structure may be,
// or if the structure may contain different arrays with different depths.
$flat = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)));
于 2012-12-17T19:55:11.723 に答える
23

使用できます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)

簡単なデモを見る

于 2012-12-17T19:27:54.893 に答える
2
<?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>";
?>

このようにarralを取得する方法はわかりませんが、この解決策は値のみを取得することです。

[編集] 申し訳ありませんが、その最も甘い:

function deepValues(array $array, array &$values) {
    foreach($array as $level) {
        if (is_array($level)) {
            deepValues($level, $values);
        } else {
            $values[] = $level;
        }
    }
}
于 2012-12-17T19:36:07.510 に答える
1

値が常に同じ深さのレベルにある場合は、実際に 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
)
于 2016-12-11T21:51:05.610 に答える
0

配列が常に同じ既知の深さを持っている場合は、多分あなたはうまく利用することができます

http://php.net/manual/es/function.array-merge.php

于 2012-12-17T19:52:12.460 に答える
0

配列に連想インデックスからのレベルが 1 つだけあり、要素が 1 つだけの場合:

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 )
        )
于 2014-04-24T10:22:19.367 に答える