函数要求接受两个字符串数组,其中一个视为新数据,另一个视为旧数据,以新数据为优先,把旧数据和新数据合并,并计算每个合并项对应两哥数组的索引位置,合并后的格式为
[
     [
         'name'=>传入数组的字符串项,
       ‘new'  =>对应在新版本中出现的索引,如果新版本没有此项,填入-1,
       ‘old’ =>对应在旧版本中出现的索引,如果旧版本没有此项,填入-1
     ],
     .............
]
注:对于重复出现的项,需要按出现的先后去匹配
举例:已知:$new = ['id','name','desc','value','value','price'];
                    $old = ['id','type','value','owner'];
function MergeDaTa($new,$old){        //具体如何实现??
}
上述function如何才能得到以下格式数据
[
        [   
    'name' => 'id',
            'new'   => 0,
            'old'   => 0
        ],[            'name'=> 'name',
            'new' => 1,
            'old' => -1
        ],[            'name'=> 'desc',
            'new' => 2,
            'old' => -1
        ],[         'name'=> 'value',
            'new' => 3,
            'old' => 2
        ],[         'name'=> 'value',
            'new' => 4,
            'old' => -1
        ],[         'name'=> 'price',
            'new' => 5,
            'old' => -1
        ],[        'name'=> 'type',
            'new' => -1,
            'old' => 1
        ],[         'name'=> 'owner',
            'new' => -1,
            'old' => 3
        ]
]

解决方案 »

  1.   


    <?php
    function MergeDaTa(&$new,&$old){
    $res = [];
    //取差集然后与新数组合并
    $total = array_merge($new,array_diff($old,$new)); foreach ($total as $v) {
    $tmp['name'] = $v;
    $new_key = array_search($v, $new); //返回键值 or FALSE
    $old_key = array_search($v, $old); if($new_key!==false){
    $tmp['new'] = $new_key; $new[$new_key]='';
    }else{
    $tmp['new'] = -1;
    }
    if($old_key!==false){
    $tmp['old'] = $old_key; $old[$old_key]='';
    }else{
    $tmp['old'] = -1;
    }

    $res[] = $tmp;
    }
    return $res;
    }
    $new = ['id','name','desc','value','value','price'];
    $old = ['id','type','value','owner'];
    echo '<pre>';
    print_r(MergeDaTa($new,$old));
      

  2.   

    <?php/**
     * 新旧数据检索
     * @param $new array 新数据
     * @param $old array 旧数据
     * @return:合并后的数组
     */
    function MergeDaTa($new,$old){
    //处理数组
    sort($all_arr = array_filter(array_unique(array_merge($new,$old))));
    //合并数据
    for($i = 0; $i < count($all_arr);$i ++){
    $new_arr[$i]["name"] = $all_arr[$i];
    //新数据
    if(in_array($all_arr[$i],$new)){
    $new_arr[$i]["new"] = array_flip($new)[$all_arr[$i]];//返回该数据位于新数组的位置
    } else {
    $new_arr[$i]["new"] = "-1";
    }
    //旧数据
    if(in_array($all_arr[$i],$old)){
    $new_arr[$i]["old"] = array_flip($old)[$all_arr[$i]];//返回该数据位于新数组的位置
    } else {
    $new_arr[$i]["old"] = "-1";
    }}
    return $new_arr;
    }//新数据
    $new = ["id","name","desc","value","value","price"];
    //旧数据
    $old = ["id","type","value","owner"];/*
    问题:上述问题如何通过 function 才能得到以下格式数据
    要求:
    -> 合并后的格式为: 
    [
         [
             "name"=>传入数组的字符串项,
             "new"  =>对应在新版本中出现的索引,如果新版本没有此项,填入-1,
             "old" =>对应在旧版本中出现的索引,如果旧版本没有此项,填入-1
         ],
         .............
    ]
    示范:
    [
            [   
                "name" => "id",
                "new"   => 0,
                "old"   => 0
            ],
            [
                "name"=> "name",
                "new" => 1,
                "old" => -1
            ],
            [
                "name"=> "desc",
                "new" => 2,
                "old" => -1
            ],
            [
                "name"=> "value",
                "new" => 3,
                "old" => 2
            ],
            [
                "name"=> "value",
                "new" => 4,
                "old" => -1
            ],
            [
                "name"=> "price",
                "new" => 5,
                "old" => -1
            ],
            [
                "name"=> "type",
                "new" => -1,
                "old" => 1
            ],
            [
                "name"=> "owner",
                "new" => -1,
                "old" => 3
            ]
    ]
    */
    //var_dump($new);
    print_r(MergeDaTa($new,$old));