【问题标题】:Compare and Merge Array比较和合并数组
【发布时间】:2012-07-18 11:44:55
【问题描述】:

我正在尝试比较和合并 php 中的数组。假设我有两个数组如下

$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'));

我想合并上述两个数组,这样我就有一组唯一的国家值,如果数组中有重复的国家,它应该添加其他三个字段的值并将其合并。

尝试以下代码 - 但我对逻辑感到困惑。

$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/>";
}

【问题讨论】:

    标签: php arrays merge


    【解决方案1】:

    你可以通过简单地保持一个由你想要合并的键组织的全局数组来做到这一点,并且你将避免以 O(n²) 的复杂性来完成它,只需简单的 O(n) 假设哈希查找关键是 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));
    

    希望有帮助!

    【讨论】:

    • 非常感谢。它就像魅力一样。现在我知道我做错了什么并使整个过程复杂化
    • 如果我有一个数组,其键值为如下所示的一些文本。 (int) 0 => object(stdClass) { country => 'India' 访问次数 => '12' newVisits => '9' percentNewVisits => (int) 75 },
    • 我还能用同样的吗?因为我们将它用作键值对?
    • 是的,代码没有假设用于描述数组中其他值的键。唯一的假设是在数组中首先定义国家。如果您对值使用关联数组,则可以进一步简化代码(删除 array_slice() 和 unset() 国家名称)。不过,您需要更改 $name = .. 以使用您的关联值。
    • 抱歉没有得到drop splice部分。
    【解决方案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 将合并它想要添加数据的数据

    【讨论】:

    • 非常感谢普南。该死的我忘了array_push:P
    猜你喜欢
    • 2013-11-26
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多