2012-05-05 7 views
3

私は主キーとしてIDを含む多くの配列を持っており、各IDの下に多次元情報があります。PHPで配列交差を実行する際に、多次元配列情報を保持するにはどうすればよいですか?

第1の例のアレイ:

array 
    14181 => 
    array 
     'industries' => 
     array 
      'weight' => string '105652' (length=6) 
      'count' => string '11' (length=2) 
    48354 => 
    array 
     'industries' => 
     array 
      'weight' => string '508866' (length=6) 
      'count' => string '10' (length=2) 

第2の例のアレイ:

array 
    16434 => 
    array 
     'business_types' => 
     array 
      'weight' => string '104614' (length=6) 
      'count' => string '1' (length=1) 
    48354 => 
    array 
     'business_types' => 
     array 
      'weight' => string '103610' (length=6) 
      'count' => string '10' (length=2) 

私は(基づいてこれらのような多くの配列の共通項を取得したいのですがここでは2つの例があります)、キーごとに各配列の重みとデータを保持する必要があります。それは、各アレイから異なる重みとカウントデータであることに注目してください。この場合、business_typeと業種。必要な

決勝アレイ:

array 
    48354 => 
    array 
     'business_types' => 
     array 
      'weight' => string '103610' (length=6) 
      'count' => string '10' (length=2) 
     'industries' => 
     array 
      'weight' => string '508866' (length=6) 
      'count' => string '10' (length=2) 

もともと私は重みとカウントを維持しようとしていなかったので、私は単にarray_intersect_keys()を行っていたし、ジョブが行われました。今私はこのデータを保持する必要があります。 array_intersect_keys()がそれを保持することを期待してサブ配列に異なる名前を付けましたが、関数内の最初の配列に対してのみ保存します。

このような操作を行う方法はありますか?

私が思いつくことができる唯一の解決策は、すべての配列を最終的なID(キー)のリストに減らし、比較した元の配列のそれぞれからウェイトとカウント情報を引き出す配列をループすることです。

+0

ソリューションは、私には罰金聞こえます。 –

+0

私はちょうどあなたにアレイマージを書いたが、今私はそれを再読した、あなたは交差点を探している、それは正しい? – jedwards

+0

私は交差点を行う必要があるだけでなく、データをマージする必要があります。私はあなたが私のソリューションの逆の順序でそれをやったと思うが、それはまだ有効であるかもしれない。 –

答えて

0

あなたの提案された解決策はうまくいくようですが、一方のリストを他方のリストにマージすることを検討することもできます。

<?php 

$a1 = array(14181 => array('industries'  => array('weight' => "105652", 'count' => "11")), 
      48354 => array('industries'  => array('weight' => "508866", 'count' => "10"))); 
$a2 = array(16434 => array('business_types' => array('weight' => "104614", 'count' => "1")), 
      48354 => array('business_types' => array('weight' => "103610", 'count' => "10"))); 

//print_r($a1); 
//print_r($a2); 

foreach($a2 as $a2k => $a2v) 
{ 
    // The loop below should only go through once, but if there are multiple types it will be ok 
    foreach($a2v as $a2vk => $a2vv) 
    { 
     $a1[$a2k][$a2vk] = $a2vv; 
    } 
} 

printf("Output:\n"); 
print_r($a1); 

printf("Output:\n"); 
print_r($a1); 

出力:

Output: 
Array 
(
    [14181] => Array 
     (
      [industries] => Array 
       (
        [weight] => 105652 
        [count] => 11 
       ) 

     ) 

    [48354] => Array 
     (
      [industries] => Array 
       (
        [weight] => 508866 
        [count] => 10 
       ) 

      [business_types] => Array 
       (
        [weight] => 103610 
        [count] => 10 
       ) 

     ) 

    [16434] => Array 
     (
      [business_types] => Array 
       (
        [weight] => 104614 
        [count] => 1 
       ) 

     ) 

) 

私はこれがあなたの提案された解決策よりも若干速くなることを信じています。


編集:上記キーが配列間で共通ではなかった場合でも、アレイをマージなるアレイマージタイプのアルゴリズムでした。以下のアルゴリズムは、2つの配列の交差を生成します。最初に質問を得ることに私のせいでは:

<?php 

$a1 = array(14181 => array('industries'  => array('weight' => "105652", 'count' => "11")), 
      48354 => array('industries'  => array('weight' => "508866", 'count' => "10"))); 
$a2 = array(16434 => array('business_types' => array('weight' => "104614", 'count' => "1")), 
      48354 => array('business_types' => array('weight' => "103610", 'count' => "10"))); 

//print_r($a1); 
//print_r($a2); 

// Pass the smaller array as first argument 
if(count($a1) <= count($a2)) 
{ 
    $res = my_merge($a1, $a2); 
} 
else 
{ 
    $res = my_merge($a2, $a1); 
} 

function my_merge($a1, $a2) 
{ 
    $res = array(); 
    foreach($a1 as $a1k => $a1v) 
    { 
     if(array_key_exists($a1k, $a2)) 
     { 
      $res[$a1k] = array_merge($a1[$a1k], $a2[$a1k]); 
     } 
    } 
    return $res; 
} 

printf("Output:\n"); 
print_r($res); 

出力:あなたが提案し

Array 
(
    [48354] => Array 
     (
      [industries] => Array 
       (
        [weight] => 508866 
        [count] => 10 
       ) 

      [business_types] => Array 
       (
        [weight] => 103610 
        [count] => 10 
       ) 

     ) 

) 
+0

どのように結合した配列を元のすべての配列にあるID(およびサブ配列)に減らすのですか?この場合は、業種とビジネスタイプのウェイトとカウントの両方を持つIDに変換しますか? –

+0

投稿を編集し、マージアルゴリズムの代わりに交差アルゴリズムを追加しました。はい、マージを使用して縮小することもできますが、私が編集で使用したアプローチはより速くなると思います。 – jedwards

関連する問題