php有两个数组map比较 通过id关联,number可能数量变化 比较他们之间增加修改删除

在PHP中,比较两个通过ID关联的数组,并确定它们之间的增加、修改和删除操作,你可以使用以下步骤:

  1. 创建两个数组:假设你有两个数组,分别表示"旧数据"和"新数据"。

  2. 使用ID作为键:为了方便比较,将这两个数组重新索引为以ID为键的关联数组。

  3. 遍历并比较:通过遍历数组,比较它们之间的变化。

    <?php

    // 示例数据
    $oldData = [
    ['id' => 1, 'number' => 10],
    ['id' => 2, 'number' => 20],
    ['id' => 3, 'number' => 30],
    ];

    $newData = [
    ['id' => 1, 'number' => 15], // 修改
    ['id' => 2, 'number' => 20], // 无变化
    ['id' => 4, 'number' => 40], // 增加
    ];

    // 将数组重新索引为以ID为键的关联数组
    $oldDataIndexed = [];
    $newDataIndexed = [];

    foreach ($oldData as $item) {
    oldDataIndexed[item['id']] = $item['number'];
    }

    foreach ($newData as $item) {
    newDataIndexed[item['id']] = $item['number'];
    }

    // 初始化比较结果
    $added = [];
    $modified = [];
    $deleted = [];

    // 比较数据
    foreach ($newDataIndexed as $id => newValue) { if (isset(oldDataIndexed[id])) { if (oldValue = oldDataIndexed[id]) {
    if ($newValue != $oldValue) {
    modified[id] = ['old' => $oldValue, 'new' => $newValue];
    }
    }
    } else {
    added[id] = $newValue;
    }
    }

    foreach ($oldDataIndexed as $id => oldValue) { if (!isset(newDataIndexed[$id])) {
    deleted[id] = $oldValue;
    }
    }

    // 输出结果
    echo "Added:\n";
    print_r($added);

    echo "\nModified:\n";
    print_r($modified);

    echo "\nDeleted:\n";
    print_r($deleted);

    ?>

上述关于PHP中比较两个通过ID关联的数组,并确定它们之间的增加、修改和删除操作的场景,在实际应用中非常广泛。以下是一些常见的应用场景:

数据库同步:

在多个数据库或数据表之间同步数据时,需要比较它们之间的差异,并确定哪些数据需要更新、插入或删除。通过比较两个数组的ID和对应值,可以高效地实现数据同步。

API数据更新:

当客户端向服务器发送更新请求时,服务器需要比较客户端发送的新数据和当前存储的旧数据,以确定哪些数据发生了变化。这种比较通常涉及ID关联的数组,以确保数据的准确性和一致性。

上述关于PHP中比较两个通过ID关联的数组的场景,常用于多种系统中,特别是在需要数据处理、同步或管理的系统中。以下是一些具体的应用系统示例:

内容管理系统(CMS):

在CMS中,内容(如文章、页面、产品等)经常需要更新和维护。通过比较新旧数据的数组,可以高效地识别出哪些内容需要更新、添加或删除。

电子商务平台:

电子商务平台需要管理大量的商品信息、订单数据和用户账户。在商品上下架、订单处理或用户权限变更时,经常需要比较数组来确定数据的增减或修改。

客户关系管理系统(CRM):

CRM系统用于管理客户信息、销售线索和服务记录。通过比较不同时间点的客户数据数组,可以识别出客户状态的变化,如新增客户、客户流失或客户升级。

企业资源规划(ERP)系统:

ERP系统整合了企业的财务、采购、生产、库存等多个模块。在数据同步和模块间交互时,经常需要比较数组来确保数据的一致性和准确性。

比如thinkphp进销存系统多表关联操作核心代码

public function afterEdit(&$data){
        //先取出上次入库的记录
        $productInModel = new ProductInModel();
        $productsInDatas = $productInModel->where('buys_id', $data['id'])->select()->toArray();

        $productsInDatasMap  = [];
        foreach ($productsInDatas as $productsInData){
            $productsInDatasMap[$productsInData['productId']] = $productsInData;
        }

        $products = $data['products'];
        // 提取数据库已存产品id
        $ids1 = array_column($productsInDatas, 'productId');

        //获取新进来的产品id
        $ids2 = array_column($products, 'id');

        //比较修改的产品是否存在新增id
        $newIds = array_diff($ids2, $ids1);

        //比较修改的产品是否存在删除的产品Id
        $missingIds = array_diff($ids1, $ids2);

        //循环入仓明细数据
        foreach ($products as $product) {
            $id = $product['id'];
            //判断是新增进来的数据
            if(in_array($id,$newIds)){
                //这里新增一个产品id来存放对应产品数据。
                $product['productId'] = $id;
                //默认id是一个自增值
                unset($product['id']);
                $product['buysId'] = $data['id'];
                //增加入库记录
                $productInModel = new ProductInModel();
                $productInModel->add($product);
                //现有产品库存数量要增加
                $productModel = new ProductModel();
                $productModel->incValue($id,'number',$product['number']);
            }else if(isset($productsInDatasMap[$id])&&$productsInDatasMap[$id]['number']!=$product['number']){
                //判断原有的产品是否已入库且数量不等
                $productInModel = new ProductInModel();
                //修改变更产品的数量
                $productInModel->where('product_id',$id)->update(['number'=>$product['number']]);
                //现有产品库存数量要增加
                $productModel = new ProductModel();
                //新的产品数量跟原有的产品数量做个比较
                $changeNumber = $product['number']-$productsInDatasMap[$id]['number'];
                //如果数量大于0 采购数量是增加的
                if($changeNumber>0){
                    $productModel->incValue($id,'number',$changeNumber);
                }else{
                    $productModel->decValue($id,'number',$changeNumber);
                }
            }
        }

        //删除不存在的产品
        foreach ($missingIds as $id){
            $productInModel = new ProductInModel();
            //软删除不存在的产品
            $productInModel->where('product_id',$id)->update(['delete_time'=>getCurrentDateTime()]);
            //现有产品库存数量要减少
            $productModel = new ProductModel();
            $productModel->decValue($id,'number',$productsInDatasMap[$id]['number']);
        }
    }
相关推荐
吾当每日三饮五升2 小时前
C++单例模式跨DLL调用问题梳理
开发语言·c++·单例模式
猫武士水星3 小时前
C++ scanf
开发语言·c++
BinaryBardC4 小时前
Bash语言的数据类型
开发语言·后端·golang
Lang_xi_4 小时前
Bash Shell的操作环境
linux·开发语言·bash
Pandaconda4 小时前
【Golang 面试题】每日 3 题(二十一)
开发语言·笔记·后端·面试·职场和发展·golang·go
zhangjiaofa4 小时前
Android中的LoadedApk:使用指南与核心代码解析
android
捕鲸叉4 小时前
QT自定义工具条渐变背景颜色一例
开发语言·前端·c++·qt
想要入门的程序猿4 小时前
Qt菜单栏、工具栏、状态栏(右键)
开发语言·数据库·qt
Elena_Lucky_baby5 小时前
在Vue3项目中使用svg-sprite-loader
开发语言·前端·javascript
土豆凌凌七5 小时前
GO随想:GO的并发等待
开发语言·后端·golang