2011-11-01 13 views
7

これはforeach、次に - >リストなどの手続きではかなり簡単に実行できることが分かりましたが(私はすでに達成しています)、私のコードは少し汚れていて、 「Tが最善の解決策のように見える...私は、次の操作を実行するためにネイティブのPHPの配列関数を使用しているよ:PHPは値で配列をマージする

私はこのように見える二つの配列があります。

 
[0] (Array)#2 
    [rank] "579" 
    [id] "1" 
[1] (Array)#4 
    [rank] "251" 
    [id] "2" 

[0] (Array)#2 
    [size] "S" 
    [status] "A" 
    [id] "1" 
[1] (Array)#15 
    [size] "L" 
    [status] "A" 
    [id] "2" 

をそして、私のように必要次のような結果になります。

 
[0] (Array)#2 
    [size] "S" 
    [status] "A" 
    [id] "1" 
    [rank] "579" 

[1] (Array)#2 
    [size] "L" 
    [status] "A" 
    [id] "2" 
    [rank] "251" 

foreachの無限のセットに入ることなく、id値(またはそれ以外)の2つの配列をマージできる方法はありますか?

+0

両方の配列の同じインデックスに同じIDの要素がありますか?言い換えれば、id 5の要素が最初の配列のインデックス3にある場合、2番目の配列のインデックス3にもなりますか? – deviousdodo

答えて

13

使用array_merge_recursive()

$array = array_merge_recursive($array1, $array2); 

したり、独自の関数を作る(それは速いかもしれない)

function my_array_merge(&$array1, &$array2) { 
    $result = Array(); 
    foreach($array1 as $key => &$value) { 
     $result[$key] = array_merge($value, $array2[$key]); 
    } 
    return $result; 
} 
$array = my_array_merge($array1, array2); 
print_r($array); 
+0

恐ろしい!、ありがとう、FYI:両方の配列で繰り返さないレコードを破棄する必要がある限り、関数のアプローチは優れています。 –

+5

これは技術的に質問に答えません。 @OsvaldoM。キーではなく、idの値に基づいて結合しようとしています。 – Ray

0

OK、のは、あなたの配列をsuppostてみましょうが$ ARR1と$ ARR2と呼ばれ、これを行うことができます:

<?php 
$newarray = Array(); 
foreach ($arr1 as $element=>$value){ 
    $newarray = array_merge($arr1[$element],$arr2[$element]) 
} 
?> 
0

レイがコメントに気付いたように、受け入れられた答えは実際に質問に答えません。私は答えを見つけることができませんでしたので、私は、次の小さなユーティリティ関数を作成し、次のよう

function array_merge_callback($array1, $array2, $predicate) { 
    $result = array(); 

    foreach ($array1 as $item1) { 
     foreach ($array2 as $item2) { 
      if ($predicate($item1, $item2)) { 
       $result[] = array_merge($item1, $item2); 
      } 
     } 
    } 

    return $result; 
} 

は、それを使用します。

array_merge_callback($array1, $array2, function ($item1, $item2) { 
    return $item1['id'] == $item2['id']; 
}); 
0

は、別の言語のような配列をマージする素晴らしいものを持っています。 これは、phpに配列の要素に自動番号が付いているためです。マージすると、別の要素をキーで置換または置換します。

今変更されました。

// array_fork 
    public static function array_fork() { 
    $args = func_get_args(); 
    $result = array(); 
    foreach ($args as $arr) { 
     is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.'); 
     foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      // recursion 
      !isset($result[$key]) && $result[$key] = array(); 
      $result[$key] = self::array_fork($result[$key], $arr[$key]); 
      continue; 
     } 
     if (is_numeric($key)) { 
      if (!in_array($arr[$key], $result)) 
      $result[] = $arr[$key]; 
     } else 
      $result[$key] = $arr[$key]; 
     } 
    } 
    return $result; 
    } 
0
function custom_array_merge(&$array1, &$array2) { 
    $result = Array(); 
    foreach ($array1 as $key_1 => &$value_1) { 
     // if($value['name']) 
     foreach ($array2 as $key_1 => $value_2) { 
      if($value_1['name'] == $value_2['name']) { 
       $result[] = array_merge($value_1,$value_2); 
      } 
     } 

    } 
    return $result; 
} 

//パス$配列1、配列2 & $と$ _2 [ '名前']を変更する//名前uをマージしたいに基づきます。

関連する問題