php - 数组相交和合并

时间:2017-01-03 18:24:32

标签: php arrays

我有这样的数组:

Array
(
      Array
      (
           [0] => xx
           [1] => 123
      )
      Array
      (
           [0] => xx
           [1] => 523
      )
      Array
      (
           [0] => xx
           [1] => 783
      )
      Array
      (
           [0] => yy
           [1] => 858
      )
      Array
      (
           [0] => yy
           [1] => 523
      )
      Array
      (
           [0] => xx
           [1] => 235
      )
)

我想做的是:

Array
(
      Array
      (
           [0] => xx
           [1] => 123
           [2] => 523
           [3] => 783
           [4] => 235
      )
      Array
      (
           [0] => yy
           [1] => 858
           [2] => 523
      )

)

所以,我只需要查找[0],找到相同的值,然后删除重复项,并在相同的[0]值下合并其他值(未知数字,尽管这里只有一个)。 如果我这样做:

$array = [array("xx","123"), array("xx","523"), array("xx","783"),      array("yy","858"), array("yy","523"), array("xx","235")];
$new=array();

$col = array_column($array, 0);

foreach( $array as $key => $value ) {
    if( ($find = array_search($value[0], $col)) !== false ) {
     unset($value[0]);
    $new[$find]= array_merge($array[$find], $value);
    }
}

print_r($new); 

我得到了这个(没有所有值):

Array
(
[0] => Array
    (
        [0] => xx
        [1] => 123
        [2] => 235
    )

[3] => Array
    (
        [0] => yy
        [1] => 858
        [2] => 523
    )

)

2 个答案:

答案 0 :(得分:1)

当其他值的数量只有一个时:

$array = [
    ['xx', 123],
    ['xx', 523],
    ['xx', 783],
    ['yy', 858],
    ['yy', 523],
    ['xx', 235],
];


$result = [];
foreach ($array as $row) {
    list($key, $value) = $row;
    if (!array_key_exists($key, $result)) {
        $result[$key] = [$key];
    }
    $result[$key][] = $value;
}

针对任意数量的其他值的更通用的解决方案:

$array = [
    ['xx'],
    ['xx', 523],
    ['xx', 783, 111],
    ['yy', 858, 222, 333],
    ['yy', 523, 444, 555, 666],
    ['xx', 235, 777, 888],
];

$result = [];
foreach ($array as $row) {
    $key = array_shift($row);
    if (!array_key_exists($key, $result)) {
        $result[$key] = [$key];
    }
    $result[$key] = array_merge($result[$key], $row);
}

此外,在最后一种情况下,array_merge()可能会被带有解压缩参数的array_push()替换:

if (sizeof($row) > 0) {
    array_push($result[$key], ...$row);
}

答案 1 :(得分:1)

使用0索引作为新数组的键并附加1索引中的其他值的简单循环:

foreach($array as $value) {
    $result[$value[0]][0] = $value[0];
    $result[$value[0]][]  = $value[1];
    //$result[$value[0]]  = array_unique($result[$value[0]]);
}
$result = array_values($result);

array_values()将数组重新索引为数字索引。

对于唯一性,只需在循环中执行array_unique()或在结尾处映射它:

$result = array_map('array_unique', $result);