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']);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__overview》学习笔记

1.GIC是基于Arm GIC架构实现的&#xff0c;该架构已经从GICv1发展到最新版本GICv3和GICv4。 Arm 拥有多个通用中断控制器&#xff0c;可为所有类型的 Arm Cortex 多处理器系统提供一系列中断管理解决方案。这些控制器的范围从用于具有小型 CPU 内核数的系统的最简单的 GIC-400 …

健身房管理系统多身份

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model

通用 OCR 理论&#xff1a;通过统一的端到端模型实现 OCR-2.0 Abstract 随着人们对人工光学字符的智能处理需求日益增长&#xff0c;传统的OCR系统&#xff08;OCR-1.0&#xff09;已越来越不能满足人们的使用需求。本文&#xff0c;我们将所有人工光学信号&#xff08;例如纯…

大数据组件(二)快速入门数据集成平台SeaTunnel

大数据组件(二)快速入门数据集成平台SeaTunnel SeaTunnel是一个超高性能的分布式数据集成平台&#xff0c;支持实时海量数据同步。 每天可稳定高效同步数百亿数据&#xff0c;已被近百家企业应用于生产。 SeaTunnel的运行流程如下图所示&#xff1a; 工作流程为&#xff1a;So…

前端如何判断多个请求完毕

在前端开发中&#xff0c;经常会遇到需要同时发起多个异步请求&#xff0c;并在所有请求都完成后再进行下一步操作的情况。 这里有几个常用的方法来实现这一需求&#xff1a; 使用 Promise.all() Promise.all() 方法接收一个 Promise 对象的数组作为参数&#xff0c;当所有的…

【机器学习】穷理至极,观微知著:微积分的哲思之旅与算法之道

文章目录 微积分基础&#xff1a;理解变化与累积的数学前言一、多重积分的高级应用1.1 高维概率分布的期望值计算1.1.1 多维期望值的定义1.1.2 Python代码实现1.1.3 运行结果1.1.4 结果解读 1.2 特征空间的体积计算1.2.1 单位球体的体积计算1.2.2 Python代码实现1.2.3 运行结果…

基于Arduino的FPV头部追踪相机系统

构建FPV头部追踪相机&#xff1a;让你置身于遥控车辆之中&#xff01; 在遥控车辆和模型飞行器的世界中&#xff0c;第一人称视角&#xff08;FPV&#xff09;体验一直是爱好者们追求的目标。通过FPV头部追踪相机&#xff0c;你可以像坐在车辆或飞行器内部一样&#xff0c;自由…

鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理

文章目录 一、call模块&#xff08;拨打电话&#xff09;1、使用makeCall拨打电话2、获取当前通话状态3、判断是否存在通话4、检查当前设备是否具备语音通话能力 二、sms模块&#xff08;短信服务&#xff09;1、创建短信2、发送短信 三、radio模块&#xff08;网络搜索&#x…

高校教务系统登录页面JS分析——安徽大学

高校教务系统密码加密逻辑及JS逆向 最近有粉丝说安徽大学的教务系统换了&#xff0c;之前用的是正方出品的系统&#xff0c;今天我来看看新版教务系统怎么模拟登录&#xff0c;总体来说&#xff0c;还是比较简单的&#xff0c;就是一个哈希加密了密码&#xff0c;其次就是一个滑…

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示 参考文章源码下载地址一、SDL2的创建、初始化、退出二、系统基本Tick、彩屏刷新、按键事件三、彩屏获取与设置颜色四、彩屏填充颜色及清屏五、彩屏显示中文和英文字符串六、彩屏显示数字七、彩屏初始化八、主函数测…

Speech Recognition vs. Voice Recognition | 语音识别工作原理 | 模型训练 | 应用

注&#xff1a;机翻&#xff0c;未校。 Speech Recognition 与 Voice Recognition 剑桥词典 speech recognition&#xff0c;语音识别 voice recognition&#xff0c;声音识别 Speech vs. Voice - What’s the Difference? | This vs. That https://thisvsthat.io/speech-vs…

《Vue3实战教程》35:Vue3测试

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug&#xff0c;并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

【复盘】2024年终总结

工作 重构风控系统 今年上半年其实就是整体重构系统&#xff0c;经历了多次加班的&#xff0c;其中的辛酸苦辣只有自己知道&#xff0c;现在来看的话&#xff0c;其实对自己还有一定的成长&#xff0c;从这件事情上也明白 绩效能不能拿到A&#xff0c;在分配的任务的时候就决…

美食烹饪互动平台

本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; IDEAEclipseVisual Studio Code(VScode)Navica…

linux-centos-安装miniconda3

参考&#xff1a; 最新保姆级Linux下安装与使用conda&#xff1a;从下载配置到使用全流程_linux conda-CSDN博客 https://blog.csdn.net/qq_51566832/article/details/144113661 Linux上删除Anaconda或Miniconda的步骤_linux 删除anaconda-CSDN博客 https://blog.csdn.net/m0_…

[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)

简介&#xff1a;从20世纪90年代开始&#xff0c;利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高&#xff0c;传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…

工厂模式与抽象工厂模式在Unity中的实际应用案例

一、实验目的 实践工厂模式和抽象工厂模式的实际应用。 创建一个小型的游戏场景&#xff0c;通过应用这些设计模式提升游戏的趣味性和可扩展性。 掌握在复杂场景中管理和使用不同类型的对象。 比较在实际游戏开发中不同设计模式的实际效果和应用场景。 学习如何进行简单的性…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…