IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP自定义函数之计算别名序列数组的差集 -> 正文阅读

[PHP知识库]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;
}
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:22:57  更:2021-11-12 19:24:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:40:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码