【问题标题】:php - array intersect and mergephp - 数组相交和合并
【发布时间】:2017-01-03 18:24:32
【问题描述】:

我有这样的数组:

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
    )

)

【问题讨论】:

  • 你在一小时前已经问过同样的问题:stackoverflow.com/q/41449036为什么又要问了?
  • 将每个生成的子数组的第一个元素作为关联数组的键而不是数组的元素是否有意义?
  • 例如array('xx' => array(123, 523, ...), 'yy' => array(858, 523))
  • 是的,这可能是有道理的,但我需要它作为第一个元素

标签: php arrays


【解决方案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);
}

【讨论】:

    【解决方案2】:

    使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 2014-03-12
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多