为了账号安全,请及时绑定邮箱和手机立即绑定

重新排列数组数据并在新数组 php 中分开

重新排列数组数据并在新数组 php 中分开

PHP
慕田峪4524236 2023-07-08 16:39:31
数组aArray(    [0] => Array        (            [member_id] => 6            [sorting] => 0            [total] => 1        )    [1] => Array        (            [member_id] => 7            [sorting] => 1            [total] => 2        ))数组bArray(    [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
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

// 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;

  }

}


查看完整回答
反对 回复 2023-07-08
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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


/*

 * 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;

    }

}

工作演示


查看完整回答
反对 回复 2023-07-08
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信