PHP自定义函数之计算别名序列数组的差集

示例

$asName = 'ids';
$newData = [
    ['ids'=>'100001','value'=>1],
    ['ids'=>'100003','value'=>2],
    ['ids'=>'100004','value'=>4],
    ['ids'=>'100005','value'=>5],
];

$oldData = [
    ['ids'=>'100001','value'=>1],
    ['ids'=>'100002','value'=>2],
    ['ids'=>'100003','value'=>3],
    ['ids'=>'100004','value'=>4],
];

$c = aliasArrayDiff($newData, $oldData,$asName);
var_dump($c);
/*
^ array:4 [
  "add" => array:1 [
    0 => array:3 [
      "ids" => "100005"
      "value" => 5
      "store_id" => 10001
    ]
  ]
  "delete" => array:1 [
    0 => array:3 [
      "ids" => "100002"
      "value" => 2
      "store_id" => 10001
    ]
  ]
  "update" => array:1 [
    0 => array:3 [
      "ids" => "100003"
      "value" => 2
      "store_id" => 10001
    ]
  ]
  "unchanged" => array:2 [
    0 => array:3 [
      "ids" => "100001"
      "value" => 1
      "store_id" => 10001
    ]
    1 => array:3 [
      "ids" => "100004"
      "value" => 4
      "store_id" => 10001
    ]
  ]
]
*/

代码

/**
 * 计算别名序列数组的差集
 *
 * @param array $newData 待比对数组1
 * @param array $oldData 待比对数组2
 * @param string $asName [可选]默认goods_id,对比数组中同时持有的依据key名称
 * @param array $attach  [可选]公共附带数据
 *
 * @return array
 * array.add[]
 * array.delete[]
 * array.update[]
 * array.unchanged[]
 */
function aliasArrayDiff(array $newData,array $oldData,
                                       string $asName='goods_id', array $attach=[])
{
    // 提取指定下标数据,返回索引数组
    $extractArrayAs = function($data, $asName){
        $_d = [];
        array_map(function($d) use (&$_d, $asName){$_d[]=$d[$asName];}, $data);
        return $_d;
    };
    $_newAsData = $extractArrayAs($newData, $asName);
    $_oldAsData = $extractArrayAs($oldData, $asName);

    // 格式化新数据
    $_asNewData = [];
    array_map(function($item) use (&$_asNewData, $asName){
        $_asNewData[$item[$asName]] = $item;
    }, $newData);

    // 比较差异 - 待删除的
    $_delete = array_diff($_oldAsData, $_newAsData);
    $_delete = array_values($_delete);

    // 比较差异 - 待新增的
    $_newAdd = array_diff($_newAsData, $_oldAsData);
    $_newAdd = array_values($_newAdd);

    // 比较差异 - 待更新的
    $_update = [];
    array_map(function($item)
    use (&$_update, $_asNewData, $asName) {
    	// 更新:2021/11/11 对比存在纰漏问题修复
        if (isset($_asNewData[$item[$asName]]) &&
            array_diff_assoc(array_values($item), array_values($_asNewData[$item[$asName]]))) {
            $_update[] = $item[$asName];
        }
    }, $oldData);

    // 归类数据
    $_data = ['add'=>[],'delete'=>[],'update'=>[],'unchanged'=>[]];
    $_mergeData = array_merge($oldData, $newData);
    foreach ($_mergeData AS $i => $item)
    {
        $item = array_merge($item, $attach);
        $_keyValue = $item[$asName];
        if (in_array($_keyValue, $_delete)) {
            $_data['delete'][] = $item;
        }elseif (in_array($_keyValue, $_newAdd)) {
            $_data['add'][] = $item;
        }elseif (in_array($_keyValue, $_update)) {
            $_data['update'][$_keyValue] = $item;
        }else{
            $_data['unchanged'][$_keyValue] = $item;
        }
    }
    $_data['update'] = array_values($_data['update']);
    $_data['unchanged'] = array_values($_data['unchanged']);

    return $_data;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陀螺蚁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值