如何在php中获取数组中的公共元素

时间:2016-10-21 09:50:02

标签: php arrays

我有一个带有一些索引的数组,我想得到公共元素。 的阵列

Array
(
    [0] => Array
    (
        [0] => Array
            (
                [Code] => A
                [Price] => 2333
                [Item] => [Item_0_1]
            )

        [1] => Array
            (
                [Code] => C
                [Price] => 2000
                [Item] => [Item_0_2]
            )

        [2] => Array
            (
                [Code] => F
                [Price] => 655
                [Item] => [Item_0_3]
            )
    )

    [1] => Array
    (
        [0] => Array
            (
                [Code] => C
                [Price] => 7632
                [Item] => [Item_1_1]
            )

        [1] => Array
            (
                [Code] => D
                [Price] => 2334
                [Item] => [Item_1_2]
            )
    )
)

所以我必须按照上面的数组做两个嵌套索引[0][1],它可以更多。 所以我必须得到基于两个索引数组的代码的公共元素,因为你可以看到只有一个共同的元素是[Code] => C,所以我必须从两个数组中得到这个元素但是常见的数组会像

[Code] => A // that will be same 
[Price] => 9632 // [0]...[Price]+[1]...[Price]
[Item] => [item_0_3,item_1_2] // this will push in array

输出我想这样

Array
(
    [0] => Array
        (
            [Code] => C
            [Price] => 9632
            [Item] => [item_0_3,item_1_2]
        )
)

所以如何使用公共数组创建新数组我尝试了foreach, array merge以及更多但是失败了我无法制作逻辑。

3 个答案:

答案 0 :(得分:1)

您可以使用array_merge_recursive(),它看起来像这样:

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

要获得类似的结果:

array(2) { 
    [0]=> array(1) {
        [0]=> array(3) {
            ["Code"]=> string(1) "A"
            ["Price"]=> string(4) "2333"
            ["Item"]=> string(8) "Item_0_1"
        }
    }
    [1]=> array(1) {
         [0]=> array(3) {
             ["Code"]=> string(1) "A"
             ["Price"]=> string(6) "121212"
             ["Item"]=> string(8) "Item_0_3" 
         }
    }
}

然后您可以正常循环遍历数组:

for($i = 0; $i <= count($merged_array) -1; $i++) {
    echo ($merged_array[$i]['Code'] == "A") : $merged_array[$i]['Price'] . ' + ' : "";
}

// Output: 2333 + 121212
  

要使用您自己的代码执行此操作,请查看此SO answer

答案 1 :(得分:0)

这将帮助您获得结果..

$array; //<----- Your input array

$code_array = array();
foreach($array as $key => $row) {
    if($key == 0) {
        $code_array = array_column($row,'Code');
    } else {
        $code_array = array_intersect($code_array, array_column($row,'Code'));
    }
}
//You will get common element code in $code_array variable

$result_array = array();
foreach($code_array as $key => $code) {
    $result_array[$key] = array(
        'Code' => $code,
        'Price' => 0,
        'Item' => ''
    );
}
// Created Result array with unique codes

foreach($array as $row) {
    foreach($row as $sub_row) {
        $key = array_search($sub_row['Code'],$code_array);
        if($key) {
            $result_array[$key]['Price'] += $sub_row['Price'];
            $result_array[$key]['Item'] .= $result_array[$key]['Item'] == '' ? $sub_row['Item'] : ','.$sub_row['Item'];
        }
    }
}
//Assigned values to result array

答案 2 :(得分:0)

这是一个简单的方法:

function merge_duplicates(array $array) {
    $newarr = [];
    foreach ($array as $arr) {
        foreach ($arr as $elem) {
            if (!isset($newarr[$elem['Code']])) {
                $newarr[$elem['Code']] = $elem;
                $newarr[$elem['Code']]['Item'] = [$elem['Item']];
            } else {
                 $newarr[$elem['Code']]['Price'] += $elem['Price'];
                 $newarr[$elem['Code']]['Item'] = array_merge($newarr[$elem['Code']]['Item'], [$elem['Item']]);
            }
        }
    }
    return array_values($newarr);
}

echo print_r(merge_duplicates($mi));

它返回整个项目列表,但是重复的项目将合并为一个,添加价格并列出项目名称或其他名称。