1

PHPで配列を比較してマージしようとしています。次のように2つの配列があるとしましょう

$topCountries1 = array(
    array(
        'India',
        '23',
        '34',
        '11'),
    array(
        'USA',
        '13',
        '24',
        '21'),
    array(
        'Japan',
        '13',
        '24',
        '21'));

$topCountries2 = array(
    array(
        'France',
        '23',
        '34',
        '11'),
    array(
        'India',
        '13',
        '24',
        '21'),
    array(
        'Japan',
        '13',
        '24',
        '21'));

上記の2つの配列をマージして、国の一意の値のセットを取得します。配列に重複する国がある場合は、他の3つのフィールドの値を追加して結合する必要があります。

次のコードを試してみてください-しかし、私はロジックと混同しています。

$topCountries = array_merge($topCountries1, $topCountries2);

$collect = array();

foreach ($topCountries as $tc) {
    echo $count = count($collect);
    if ($count > 0) {
        foreach ($collect as $c) {
            if ($c[0] == $tc[0]) {
                echo "match<br/>";
                $collect[] = $tc;
            } else {
                $collect[] = $tc;
                echo "no match<br/>";
            }
        }
    } else {
        $collect[] = $tc;
    }
    echo "<br/>";
}
4

2 に答える 2

2

私はあなたの答えを別の方法で試し、あなたが望むものをもたらしました。

    $topCountries1 = array(
    array(
        'India',
        '23',
        '34',
        '11'),
    array(
        'USA',
        '13',
        '24',
        '21'),
    array(
        'Japan',
        '13',
        '24',
        '21'));

$topCountries2 = array(
    array(
        'France',
        '23',
        '34',
        '11'),
    array(
        'India',
        '13',
        '24',
        '21'),
    array(
        'Japan',
        '13',
        '24',
        '21'));


$collection = array();

foreach ($topCountries1 as $tc1) {
    foreach($topCountries2 as $tc2){
        if(in_array($tc1[0], $tc2)){
            $collect[0] = $tc1[0];
            $collect[1] = $tc1[1] + $tc2[1];
            $collect[2] = $tc1[2] + $tc2[2];
            $collect[3] = $tc1[3] + $tc2[3];
            array_push($collection, $collect);
        }
    }
}
$final_array = $collection;
foreach($topCountries1 as $tc1){
    $flag = true;
    foreach($collection as $coll){
        if(in_array($tc1[0], $coll)){
            $flag = false;
            break;
        }
    }
    if($flag){
        array_push($final_array, $tc1);
    }
}
foreach($topCountries2 as $tc1){
    $flag = true;
    foreach($collection as $coll){
        if(in_array($tc1[0], $coll)){
            $flag = false;
            break;
        }
    }
    if($flag){
        array_push($final_array, $tc1);
    }
}
var_dump($final_array);

array_mergeは、データを追加したいデータをマージします

于 2012-07-18T11:58:24.993 に答える
2

マージするキーごとにグローバル配列を整理するだけで実行でき、キーのハッシュルックアップがO(1)。

これは以前に投稿されたものよりも単純なソリューションであり、コードを追加せずに任意の数の入力配列を受け入れるだけでなく、コードを追加せずに国名の後の値の数を拡張できます。

$topCountries1 = array(
    array(
        'India',
        '23',
        '34',
        '11',
    ),
    array(
        'USA',
        '13',
        '24',
        '21',
    ),
    array(
        'Japan',
        '13',
        '24',
        '21',
    ),
);

$topCountries2 = array(
    array(
        'France',
        '23',
        '34',
        '11',
    ),
    array(
        'India',
        '13',
        '24',
        '21',
    ),
    array(
        'Japan',
        '13',
        '24',
        '21',
    ),
);

$countries = array();
$data = array($topCountries1, $topCountries2);

foreach($data as $entries)
{
    foreach($entries as $country)
    {
        $name = $country[0];

        // if first time we see the country, add it to the list
        if (!isset($countries[$name]))
        {
            $countries[$name] = $country;
        }
        else
        {
            // add all fields after the first (the name)
            foreach (array_slice($country, 1, null, true) as $idx => $value)
            {
                $countries[$name][$idx] += $value;
            }
        }
    }
}

var_dump($countries);
var_dump(array_values($countries));

お役に立てば幸いです。

于 2012-07-18T11:59:52.970 に答える