9
$arr[] = array('A','B');
$arr[] = array('C','B');
...

のすべてのサブ配列のマージ結果を取得する必要があり$arrます。

また、重複するエントリの場合は、1 つだけ取得する必要があります。

4

7 に答える 7

25

本当にループしたくない場合は、これを試してください:

$arr[] = array('A','B');
$arr[] = array('C','B');
$arr[] = array('C','D');
$arr[] = array('F','A');
$merged = array_unique(call_user_func_array('array_merge', $arr));
于 2010-01-26T19:49:08.827 に答える
15

別の質問でOK、 PHPバージョン> = 5.3.0を使用すると、次のことが実際に可能であることがわかりました(成功せずに試しましたが、バージョンが間違っていました)。

$merged_array = array_reduce($arr, 'array_merge', array());

一意の値のみが必要な場合は、以下を適用できますarray_unique

$unique_merged_array = array_unique($merged_array);

これは、配列にフラットな要素しかない場合(つまり、他の配列がない場合)に機能します。ドキュメントから:

注:array_unique()これは、多次元配列で機能することを意図したものではないことに注意してください。

配列に配列がある場合は、手動で確認する必要があります。例array_walk

$unique_values = array();

function unique_value($value, &$target_array) {
    if(!in_array($value, $target_array, true))
        $target_array[] = $value;
}

array_walk($merged_values, 'unique_value', $unique_values);

内部ループ(つまり、何array_walkが行われているのか)は、少なくとも明示的なループよりも遅くはないと想定できます。

于 2010-01-26T16:45:51.010 に答える
8
array_unique(array_merge($arr[0], $arr[1]));

または無制限の場合、これでうまくいくはずです:

$result_arr = array();
foreach ($arr as $sub_arr) $result_arr = array_merge($result_arr, $sub_arr);
$result_arr = array_unique($result_arr);
于 2010-01-26T15:54:58.717 に答える
1

$ merged_array = array_reduce($ serp_res、'array_merge'、array()); クォータを追加すると、「array_merge」が機能しました。

于 2012-01-31T13:34:13.457 に答える
1

この回答は、Felix Kling の投稿に基づいています。「非配列」サブ要素を修正した、より正確なバージョンです。

$res = array_reduce($res, function(&$res, $v) {
                            return array_merge($res, (array) $v);
                        }, array());
于 2014-11-27T12:53:27.603 に答える