12

動物の配列が 2 つあります (たとえば)。

$array = array(
    array(
        'id' => 1,
        'name' => 'Cat',
    ),
    array(
        'id' => 2,
        'name' => 'Mouse',
    )
);

$array2 = array(
    array(
        'id' => 2,
        'age' => 321,
    ),
    array(
        'id' => 1,
        'age' => 123,
    )
);

ID で 2 つの配列を 1 つにマージするにはどうすればよいですか?

4

10 に答える 10

10

@アンディ

http://se.php.net/array_merge

それが私の最初の考えでしたが、うまくいきません - しかしarray_merge_recursiveはうまくいくかもしれません - 今チェックするのが面倒です。

于 2008-08-24T17:43:00.033 に答える
3

これは、Erik が提案したこと (配列キーとして ID 番号) を実行し、vlaues を にマージ$array2$resultsます。

$results = array();

foreach($array as $subarray)
{
    $results[$subarray['id']] = array('name' => $subarray['name']);
}

foreach($array2 as $subarray)
{
    if(array_key_exists($subarray['id'], $results))
    {
        // Loop through $subarray would go here if you have extra 
        $results[$subarray['id']]['age'] = $subarray['age'];
    }
}
于 2008-08-24T16:38:01.733 に答える
3

まず、ID をインデックス (または、php 配列が imo であるマッピング スタイルの配列のキー) として使用しないのはなぜですか?

$array = array(
    1 => array(
        'name' => 'Cat',
    ),
    2 => array(
        'name' => 'Mouse',
    )
);

その後、一方の配列を foreach し、もう一方の項目に対して array_merge を実行する必要があります。

foreach($array2 as $key=>$value) {
  if(!is_array($array[$key])) $array[$key] = $value;
  else $array[$key] = array_merge($array[key], $value); 
}

少なくともそのようなもの。おそらく、より良い解決策がありますか?

于 2008-08-24T16:28:08.590 に答える
3
<?php
      $a = array('a' => '1', 'b' => array('t' => '4', 'g' => array('e' => '8')));
      $b = array('c' => '3', 'b' => array('0' => '4', 'g' => array('h' => '5', 'v' => '9')));
      $c = array_merge_recursive($a, $b);
      print_r($c);
?>

array_merge_recursive — 2 つ以上の配列を再帰的にマージする

出力:

        Array
(
    [a] => 1
    [b] => Array
        (
            [t] => 4
            [g] => Array
                (
                    [e] => 8
                    [h] => 5
                    [v] => 9
                )

            [0] => 4
        )

    [c] => 3
)
于 2008-08-24T21:19:05.427 に答える
1

パフォーマンスの問題があるため、array_splice私はむしろ好みます。私の解決策は次のとおりです。array_merge

<?php 
array_splice($array1,count($array1),0,$array2);
?>
于 2013-02-04T11:18:21.197 に答える
1

@アンディ

私はすでにそれを見てきましたが、多次元配列のマージにどのように役立つかわかりませんでした。例を挙げることができるかもしれません。

@ケビン

以下のコードは非常に遅くなると思うので、おそらくこれが必要になるでしょう。私はADOdb(および他のクエリにはODBC)を使用しているため、実際のコードは少し異なりますが、それを機能させて独自の回答を投稿します。

これは機能しますが、毎回 2 番目のループを通過するため、非常に遅くなると思います。

foreach($array as &$animal)
{
    foreach($array2 as $animal2)
    {
        if($animal['id'] === $animal2['id'])
        {
            $animal = array_merge($animal, $animal2);
            break;
        }
    }
}
于 2008-08-24T17:58:57.983 に答える
1
foreach ($array as $a)
    $new_array[$a['id']]['name'] = $a['name'];

foreach ($array2 as $a)
    $new_array[$a['id']]['age'] = $a['age'];

これは結果です:

    [1] => Array
        (
            [name] => Cat
            [age] => 123
        )

    [2] => Array
        (
            [name] => Mouse
            [age] => 321
        )
于 2013-02-04T11:31:39.137 に答える
1

PHP 5.3 では、この種のマージを array_replace_recursive() で実行できます。

http://www.php.net/manual/en/function.array-replace-recursive.php

結果の配列は次のようになります。

Array (
    [0] => Array
        (
            [id] => 2
            [name] => Cat
            [age] => 321
        )

    [1] => Array
        (
            [id] => 1
            [name] => Mouse
            [age] => 123
        )
)

結果としてあなたが望んでいたものだと思います。

于 2013-06-24T05:14:28.607 に答える
-3
$new = array();
foreach ($array as $arr) {
    $match = false;
    foreach ($array2 as $arr2) {
        if ($arr['id'] == $arr2['id']) {
           $match = true;
           $new[] = array_merge($arr, $arr2);
           break;
        }
    }
    if ( !$match ) $new[] = $arr;
}
于 2008-08-24T17:32:42.647 に答える