• PHP 自定义方法实现数组合并


    在PHP中提供了强大的数组功能,对于数组的合并也提供了两个方法:array_merge 和 array_merge_recursive

    但对于我们千变万化的业务来说这些内置的方法并不完全能满足我们的要求
    如我现在就遇到了数组合并这方面的问题,要求是这样的:
    有两个二维数组,这两个数组大部分的健名是相同的
    但有些健名可能并不存在于另一个数组中,现在需要我做的是将第二个数组中所有健值复制到第一个数组中(条件是:两个数组某个健名的值是相同的情况下)
    显然内置的两个方法都不能满足要求(两个方法都只是将第二个数组中的健值复制到第一个对应的健上)
    $ar1 = array("color"=> array("favorite"=>"red","name"=>"test"));
    $ar2 = array("color"=> array("favorite"=>"green","code"=>"code"));
    print_r (array_merge ($ar1, $ar2));
    print_r(array_merge_recursive ($ar1, $ar2));
    可以看到array_merge只是将每个第二个数组的值复制到第一个数组上而已,显然数组一favorite.name被数组二code给覆盖了
    而array_merge_recursive不会覆盖掉相同的健名但一旦两个数组健名相同则它会创建一个新数组并将两个数组中值添加到新数组中
     
    以下是我自定义的实现方法:
     
    /**
     * @Author:     HTL
     * @Email:       Huangyuan413026@163.com
     * @DateTime:    2016-04-21 12:01:51
     * @Description: 根据指定的健名将$ar2中的所有健值复制到$ar1对应的健值中
     * @Return:$ar1
     */
     function array_more_merge($ar1,$ar2,$key_name){
        if(
            !$ar1 
            || !is_array($ar1) 
            || count($ar1)<=0
            || !$ar2
            || !is_array($ar2) 
            || count($ar2)<=0
            || !$key_name 
            || strlen($key_name)<=0)
        {
            return $ar1;
        }
        /*不能使用for进行循环,因为如果数组中的索引不是连续的则使用for可能无法正确的完成循环
        如 $a = 
               Array(
                1 => Array("id" => 1 )
               ,8 => Array("id" => 2 )
               ,4 => Array("id" => 4 )
              );
        该数组数为3所以只能找到[1],而[8][4]在循环中不会进行处理,因为$i <=count($a)不成立
      */ for ($i=0; $i <=count($a) ; $i++) { print_r($a[$i]); } foreach ($ar1 as $i=>$items) { foreach ($ar2 as $key=>$item) { if($ar2[$key][$key_name]==$ar1[$i][$key_name]){ $keys = array_keys($ar2[$key]); foreach ($keys as $name) { $ar1[$i][$name] = $ar2[$key][$name]; } } } } return $ar1; } $ar1 = '{"1":{"cost":"1","id":"1","total_price":"5"},"2":{"cost":"2","id":"2","total_price":"10"},"4":{"cost":"4","id":"4","total_price":"20"}}'; $ar1 = json_decode($ar1,true); $ar2 = '{"1":{"cost":"1","id":"1","total_price":"5"},"2":{"cost":"20","id":"2","total_price":"100"},"4":{"cost":"40","id":"4","total_price":"200"}}'; $ar2 = json_decode($ar2,true); echo "array_merge_recursive:"; print_r(array_merge_recursive($ar1,$ar2)); echo "array_merge:"; print_r(array_merge($ar1,$ar2)); echo "array_more_merge:"; print_r($this->array_more_merge($ar1,$ar2,"id")); die();

      





  • 相关阅读:
    格式化日期为yyyy-MM-dd
    JavaScript 原型
    SSD 车辆检测 实现
    Unity模拟自动驾驶方向盘角度预测
    交通标识牌识别
    cifar-10 No such file or directory: '/home/ /.keras/datasets/cifar-10-batches-py/data_batch_1'
    Keras 使用多层感知器 预测泰坦尼克 乘客 生还概率
    else
    Keras源码下载记录
    import cv2 失败 ImportError:DLL load fail:找不到指定模块
  • 原文地址:https://www.cnblogs.com/huangtailang/p/5416878.html
Copyright © 2020-2023  润新知