2

数组 a

Array
(
    [0] => Array
        (
            [member_id] => 6
            [sorting] => 0
            [total] => 1
        )

    [1] => Array
        (
            [member_id] => 7
            [sorting] => 1
            [total] => 2
        )

)

数组 b

Array
(
    [0] => Array
        (
            [member_id] => 2
            [total] => 3
        )

    [1] => Array
        (
            [member_id] => 6
            [total] => 1
        )

    [2] => Array
        (
            [member_id] => 7
            [total] => 2
        )

)

问题:以上数据我尝试循环数组并存储到新数组中,如下所示(最终数据)。首先,如果第二个数组缺少成员数据,那么我需要从第一个数组中获取并将其存储到一个新数组中。除此之外,如果缺少排序,我需要从第一个数组中获取排序值。最后,我能够很好地获取所有数据,但最后一个值存储到其中会重复。任何人都可以对此提供帮助:(?我的逻辑停留在这里。

我的代码返回

Array
(
    [0] => Array
        (
            [member_id] => 6
            [total] => 1
            [sorting] => 0
        )

    [1] => Array
        (
            [member_id] => 7
            [total] => 2
            [sorting] => 1
        )

    [2] => Array
        (
            [member_id] => 7
            [total] => 2
            [sorting] => 
        )

)

最终数据应为:

Array
(
    [0] => Array
        (
            [member_id] => 6
            [total] => 1
            [sorting] => 0
        )

    [1] => Array
        (
            [member_id] => 7
            [total] => 2
            [sorting] => 1
        )

    [2] => Array
        (
            [member_id] => 2
            [total] => 3
            [sorting] => 2
        )

)

代码:https ://3v4l.org/WBLCC

4

2 回答 2

2
// create a version of $a that uses the member_id as key, makes look-up easier
$a_reindexed = array_combine( array_column($a, 'member_id'), array_values($a) );
// get the current maximum sorting value from the elements in $a
$max_sort = max(array_column($a, 'sorting'));

$result = [];
// add values from $b to the result
foreach($b as $key => $value) {
    $result[$key] = $value;
    // set the sorting property to that of the corresponding element from $a_reindexed
    // or PHP_INT_MAX if the former doesn’t exist
    $result[$key]['sorting'] = $a_reindexed[$value['member_id']]['sorting'] ?? PHP_INT_MAX;
}
// sort the result array by the sorting value, so all elements with PHP_INT_MAX will go to the end
usort($result, function($a, $b) { return $a['sorting'] <=> $b['sorting']; });
// set new sorting value for all items having it set to PHP_INT_MAX
foreach($result as $key => $value) {
  if($value['sorting'] == PHP_INT_MAX) {
    $result[$key]['sorting'] = ++$max_sort;
  }
}
于 2020-06-30T08:19:23.317 回答
1

可能适合您需求的基本解决方案:

/*
 * first, store all records with matching member_id into store $c
 */
$c = [];
foreach ($b as $key0 => $value0) {
    foreach ($a as $key1 => $value1) {
        // matching 'member_id'?
        if ($value0['member_id'] === $value1['member_id']) {
            // inject record into store $c
            $c[] = $a[$key1];
        }
    }
}

/*
 * second, inject non-matching records from $b into store $c
 */
$ids = array_column($c, 'member_id');
foreach ($b as $key => $value) {
    if (!in_array($value['member_id'], $ids)) {
        $sorting = max(array_column($c, 'sorting')) + 1;
        $value['sorting'] = $sorting;
        $c[] = $value;
    }
}

工作演示

于 2020-06-30T09:58:01.017 回答