合并多维数组中的相同键

时间:2014-04-16 12:32:06

标签: php arrays multidimensional-array

我有一个多维数组,其中有一些'键'键可以具有相同的值。我需要合并这些键并创建一个来自非键的子数组'具有不同值的键。

Array
(
    [0] => Array
        (
            [entry_id] => 1
            [ic] => 2147483647
            [name] => Kořínková Blanka
            [residency] => Štětí, Lukešova 354, 411 08
            [file_no] => KSUL 77 INS 18898 / 2013
            [detail] => 749371da-725c-4738-8def-2f7167142a6f
        )

    [1] => Array
        (
            [entry_id] => 1
            [ic] => 2147483647
            [name] => Kořínková Blanka
            [residency] => Štětí, Lukešova 354, 411 08
            [file_no] => KSUL 77 INS 21218 / 2013
            [detail] => 43b6a718-4647-451d-9c53-50dfee8403ff
        )

    [2] => Array
        (
            [entry_id] => 2
            [ic] => 46900217
            [name] => ENTEC a.s. "v likvidaci"
            [residency] => Staré Město, Brněnská 1916, 686 03
            [file_no] => KSBR 28 INS 1232 / 2013
            [detail] => e2155a52-c464-4357-b71b-4f4ff75585eb
        )

)

基于相同' entry_id'

的所需输出
Array
(
    [0] => Array
        (
            [entry_id] => 1
            [ic] => 2147483647
            [name] => Kořínková Blanka
            [residency] => Štětí, Lukešova 354, 411 08
            [file_no] => Array
                 (
                       [0] => KSUL 77 INS 18898 / 2013
                       [1] => KSUL 77 INS 21218 / 2013
                 )
            [detail] => Array
                 (
                       [0] => A749371da-725c-4738-8def-2f7167142a6f
                       [1] => 43b6a718-4647-451d-9c53-50dfee8403ff
                 )
        )

    [1] => Array
        (
            [entry_id] => 2
            [ic] => 46900217
            [name] => ENTEC a.s. "v likvidaci"
            [residency] => Staré Město, Brněnská 1916, 686 03
            [file_no] => KSBR 28 INS 1232 / 2013
            [detail] => e2155a52-c464-4357-b71b-4f4ff75585eb
        )

)

我该怎么做?

1 个答案:

答案 0 :(得分:3)

您可以使用array_reduce()array_merge()原则通过一个功能块解决您的问题:

$mergeId = 'entry_id';

$data = array_reduce($data, function($c, $x) use ($mergeId)
{
   $c[$x[$mergeId]] = isset($c[$x[$mergeId]])
      ?array_combine(
          $z=array_keys($c[$x[$mergeId]]), 
          array_map(function($y) use ($x, $c, $mergeId)
          {
             return in_array($x[$y], (array)$c[$x[$mergeId]][$y])
                ?$c[$x[$mergeId]][$y]
                :array_merge((array)$c[$x[$mergeId]][$y], [$x[$y]]);
          }, $z)
       )
      :$x;
   return $c;
}, []);

如果您需要重新索引结果集,则可能需要应用array_values()(因此密钥将是连续的,从0开始)。查看fiddle