Php 如何将数组与子元素合并

Php 如何将数组与子元素合并,php,Php,我有一个具有相同customerid的数组。我想将所有相同的customerid数组合并到一个数组中,只需对数组进行少量修改 Array ( [0] => Array ( [customerid] => 13 [customer_fullname] => Chris [profession_id] => 8 [profession_name] =>

我有一个具有相同
customerid
的数组。我想将所有相同的
customerid
数组合并到一个数组中,只需对数组进行少量修改

Array
(
    [0] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [profession_id] => 8
            [profession_name] => Producer
         )

    [1] => Array
        (
            [customerid] => 1
            [customer_fullname] => John
            [profession_id] => 8
            [profession_name] => Producer

        )

    [2] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [profession_id] => 7
            [profession_name] => Camera

        )

)
现在我想创建一个新数组,如下所示:

Array(
    [customerid] => 13
    [customer_fullname] => Chris
    [new_array] => array(
        [0]=>[profession_id] => 8, [profession_name] => Producer, 
        [1]=>[profession_id] => 7, [profession_name] => Camera
    )
)

花了一些时间在这上面,但没能把它弄好

如果要合并很多记录,有更好的方法,但是如果您想找到一种方法,只需按照说明合并两个记录,我会这样做:

$array1 = array(
      'customerid' => 13
      'customer_fullname' => 'John',
      'profession_id' => 8,
      'profession_name' => 'Producer'
);
$array2 = array(
      'customerid' => 13
      'customer_fullname' => 'John',
      'profession_id' => 7,
      'profession_name' => 'Director'
);

function merge_customers($customerA, $customerB)
{
    $newCustomer = array();
    if ($customerA['customerid'] == $customerB['customerid'])
    {
        $newCustomer['customerid'] = $customerA['customerid'];
        $newCustomer['customer_fullname'] = $customerA['customer_fullname'];

        $newCustomer['new_array'] = array(
            array(
                'profession_id' => $customerA['profession_id'],
                'profession_name' => $customerA['profession_name']
            ),
            array(
                'profession_id' => $customerB['profession_id'],
                'profession_name' => $customerB['profession_name']
            )
        );

        return $newCustomer;
    }

    /* We can't merge these if they're different customers. */
    return NULL;
}

如果要合并很多记录,有更好的方法,但如果您想找到一种方法,只需按照说明合并两个记录,我会这样做:

$array1 = array(
      'customerid' => 13
      'customer_fullname' => 'John',
      'profession_id' => 8,
      'profession_name' => 'Producer'
);
$array2 = array(
      'customerid' => 13
      'customer_fullname' => 'John',
      'profession_id' => 7,
      'profession_name' => 'Director'
);

function merge_customers($customerA, $customerB)
{
    $newCustomer = array();
    if ($customerA['customerid'] == $customerB['customerid'])
    {
        $newCustomer['customerid'] = $customerA['customerid'];
        $newCustomer['customer_fullname'] = $customerA['customer_fullname'];

        $newCustomer['new_array'] = array(
            array(
                'profession_id' => $customerA['profession_id'],
                'profession_name' => $customerA['profession_name']
            ),
            array(
                'profession_id' => $customerB['profession_id'],
                'profession_name' => $customerB['profession_name']
            )
        );

        return $newCustomer;
    }

    /* We can't merge these if they're different customers. */
    return NULL;
}

快速破解,也许有更好的解决方案。 注意:第二个“for each”循环仅在数组可能没有相同字段时才需要

function merge($array1, $array2){
     $result = array();
     foreach($array1 as $key => $value){
         if(isset($array2[$key]) && $array2[$key]!=$array1[$key]){
              $result[$key][]=$value;
              $result[$key][]=$array2[$key];
         }else{
              $result[$key]=$value;
         }
     }
     foreach($array2 as $key => $value){
        if(!isset($result[$key])){
             $result[$key] = $value;
        }
     }
     return $result;
}

print_r(merge($array1, $array2));

快速破解,也许有更好的解决方案。 注意:第二个“for each”循环仅在数组可能没有相同字段时才需要

function merge($array1, $array2){
     $result = array();
     foreach($array1 as $key => $value){
         if(isset($array2[$key]) && $array2[$key]!=$array1[$key]){
              $result[$key][]=$value;
              $result[$key][]=$array2[$key];
         }else{
              $result[$key]=$value;
         }
     }
     foreach($array2 as $key => $value){
        if(!isset($result[$key])){
             $result[$key] = $value;
        }
     }
     return $result;
}

print_r(merge($array1, $array2));

该扩展解决方案也非常适合查找和“合并”具有相同
customerid的多组条目。使用的功能:
array\u filter
array\u count\u value
array\u key
array\u walk
array\u chunk
array\u value

// supposing $arr is your initial array

// finds which 'customerid' has multiple entries
$dupIds = array_filter(array_count_values(array_column($arr, "customerid")), function($v) {
    return $v > 1;
});

$dupIds = array_keys($dupIds);
$result = [];

array_walk($arr, function($v) use(&$result, $dupIds) {
    if (in_array($v['customerid'], $dupIds)) {
        $parts = array_chunk($v, 2, true);
        if (!isset($result[$v['customerid']])) {
            $result[$v['customerid']] = $parts[0] + ['new_array' => [$parts[1]]];
        } else {
            $result[$v['customerid']]['new_array'][] = $parts[1];
        }
    }
});

print_r(array_values($result));
输出:

Array
(
    [0] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [new_array] => Array
                (
                    [0] => Array
                        (
                            [profession_id] => 8
                            [profession_name] => Producer
                        )

                    [1] => Array
                        (
                            [profession_id] => 7
                            [profession_name] => Camera
                        )
                )
        )
)

该扩展解决方案也非常适合查找和“合并”具有相同
customerid的多组条目。使用的功能:
array\u filter
array\u count\u value
array\u key
array\u walk
array\u chunk
array\u value

// supposing $arr is your initial array

// finds which 'customerid' has multiple entries
$dupIds = array_filter(array_count_values(array_column($arr, "customerid")), function($v) {
    return $v > 1;
});

$dupIds = array_keys($dupIds);
$result = [];

array_walk($arr, function($v) use(&$result, $dupIds) {
    if (in_array($v['customerid'], $dupIds)) {
        $parts = array_chunk($v, 2, true);
        if (!isset($result[$v['customerid']])) {
            $result[$v['customerid']] = $parts[0] + ['new_array' => [$parts[1]]];
        } else {
            $result[$v['customerid']]['new_array'][] = $parts[1];
        }
    }
});

print_r(array_values($result));
输出:

Array
(
    [0] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [new_array] => Array
                (
                    [0] => Array
                        (
                            [profession_id] => 8
                            [profession_name] => Producer
                        )

                    [1] => Array
                        (
                            [profession_id] => 7
                            [profession_name] => Camera
                        )
                )
        )
)

实际上是的……可能有多个阵列,而不仅仅是2个。有什么更好的方法吗?我会在几分钟内添加,当然。根据您的更新,我会按照@RomanPerekhrest建议的方式进行:)实际上是的……可能有多个数组,而不仅仅是2个。有什么更好的方法吗?我会在几分钟内添加它,当然。根据您的更新,我会按照@RomanPerekhrest建议的方式进行:)您想为第一个customerid omly还是为所有客户构建阵列?我正在合并所有具有相同customerid的阵列,所以在我们的例子中,有两个customerid具有相同的id,所以我们将其合并。那么[customerid]=>1是什么呢?我们忽略了这一点,因为它没有任何匹配的customerid。您是要为第一个customerid omly还是所有customerid构建阵列?我将合并所有具有相同customerid的阵列,在我们的例子中,有两个customerid具有相同的id,所以我们将其合并。那么[customerid]=>1是什么呢?我们忽略了这一点,因为它没有任何匹配的customerid…但是可能有n个相同的customerid…但是可能有n个相同的customerid