3

主キーとして ID を含む多くの配列があり、各 ID の下に多次元情報があります。以下に 2 つの例を示します。

最初の配列の例:

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)

これらのような多くの配列の共通部分を (キーに基づいて) 取得したいのですが、キーごとに各配列の重みとカウント データを保持する必要があります。各配列の重みとカウントのデータが異なることに注意してください。この場合、business_type と industry.

必要な最終配列:

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 ( keys ) のリストに減らしてから、その配列をループして、比較した元の配列のそれぞれから重みとカウントの情報を取得することです。

4

1 に答える 1

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
                )

        )

)
于 2012-05-05T03:00:48.877 に答える