php - array intersect and merge

wtlkbnrh  于 2023-08-02  发布在  PHP
关注(0)|答案(3)|浏览(123)

我有这样的数组:

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
    )

)

kx5bkwkv

kx5bkwkv1#

当其他值的数量仅为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);
}

mzillmmw

mzillmmw2#

一个简单的循环,使用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()或在末尾Map它:

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

klr1opcd

klr1opcd3#

你可以使用array_replace函数。
如果第一个数组中的键存在于第二个数组中,则其值将被第二个数组中的值替换。如果键存在于第二个数组中,而不是第一个数组中,则它将在第一个数组中创建。如果一个键只存在于第一个数组中,它将保持原样。如果传递了几个数组进行替换,它们将按顺序处理,后面的数组将覆盖前面的值。array_replace()不是递归的:它将用第二个数组中的任何类型替换第一个数组中的值。
@param array $array -替换元素的数组。
@param array ...$replacements
@return array -如果发生错误,则返回null。
@link https://php.net/manual/en/function.array-replace.php
将传递的数组中的元素替换到第一个数组中

相关问题