Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并两个数组合并相同的数据添加新数据_Php_Arrays - Fatal编程技术网

Php 合并两个数组合并相同的数据添加新数据

Php 合并两个数组合并相同的数据添加新数据,php,arrays,Php,Arrays,从数据库检索数据: $db = array ( 0 => array ( 'stay' => '10', 'end' => '2015-12-29', 'start' => '2015-12-20', 'pid' => '231096236', 'normal_price' => '385', 'promo_price' => '385', 'resel

从数据库检索数据:

$db = array (
    0 => 
    array (
      'stay' => '10',
      'end' => '2015-12-29',
      'start' => '2015-12-20',
      'pid' => '231096236',
      'normal_price' => '385',
      'promo_price' => '385',
      'resell_price' => '385',
    ),
    1 => 
    array (
      'stay' => '7',
      'end' => '2016-01-05',
      'start' => '2015-12-30',
      'pid' => '231096235',
      'normal_price' => '385',
      'promo_price' => '385',
      'resell_price' => '385',
    ),
    2 => 
    array (
      'stay' => '3',
      'end' => '2053-01-01',
      'start' => '2016-01-06',
      'pid' => '231096234',
      'normal_price' => '385',
      'promo_price' => '385',
      'resell_price' => '385',
    ),
  ),
要与之合并的新阵列:

$new = array (
    0 => 
    array (
      'stay' => '2',
      'end' => '2015-07-01',
      'start' => '2015-06-03',
      'normal_price' => '145',
      'promo_price' => '145',
      'resell_price' => '135',
    ),
    1 => 
    array (
      'stay' => '4',
      'end' => '2015-07-05',
      'start' => '2015-07-02',
      'pid' => '231096235',
      'normal_price' => '100',
      'promo_price' => '100',
      'resell_price' => '100',
    ),
    2 => 
    array (
      'stay' => '4',
      'end' => '2015-09-03',
      'start' => '2015-07-06',
      'pid' => '231096236',
      'normal_price' => '100',
      'promo_price' => '100',
      'resell_price' => '100',
    ),
  ),
预期结果:

$expected = array (
    0 => 
    array (
      'stay' => '2',
      'end' => '2015-07-01',
      'start' => '2015-06-03',
      'normal_price' => '145',
      'promo_price' => '145',
      'resell_price' => '135',
    ),
    1 => 
    array (
      'stay' => '4',
      'end' => '2015-07-05',
      'start' => '2015-07-02',
      'pid' => '231096235',
      'normal_price' => '100',
      'promo_price' => '100',
      'resell_price' => '100',
    ),
    2 => 
    array (
      'stay' => '4',
      'end' => '2015-09-03',
      'start' => '2015-07-06',
      'pid' => '231096236',
      'normal_price' => '100',
      'promo_price' => '100',
      'resell_price' => '100',
    ),
    3 => 
    array (
      'stay' => '3',
      'end' => '2053-01-01',
      'start' => '2016-01-06',
      'pid' => '231096234',
      'normal_price' => '385',
      'promo_price' => '385',
      'resell_price' => '385',
    ),
  ),
到目前为止,我的结果是:

$merge = array (
    0 => 
    array (
      'stay' => '2',
      'end' => '2015-07-01',
      'start' => '2015-06-03',
      'normal_price' => '145',
      'promo_price' => '145',
      'resell_price' => '135',
    ),
    1 => 
    array (
      'stay' => '4',
      'end' => '2015-07-05',
      'start' => '2015-07-02',
      'pid' => '231096235',
      'normal_price' => '100',
      'promo_price' => '100',
      'resell_price' => '100',
    ),
    2 => 
    array (
      'stay' => '4',
      'end' => '2015-09-03',
      'start' => '2015-07-06',
      'pid' => '231096236',
      'normal_price' => '100',
      'promo_price' => '100',
      'resell_price' => '100',
    ),
  ),
这些是要求:

  • 若新数组中的记录并没有pid(价格id),那个么它是 被认为是新的数据。(记录开始日期:2015-06-03,结束日期: 2015-06-03)
  • 如果新数组中的记录具有pid并与表中的记录之一匹配,则新记录的值将覆盖旧记录(pid:231096235和pid:231096236的记录)
  • 若数据库中的记录有pid,但与新数组中的任何pid不匹配,则应将其添加到新数组中(它应为pid为231096234的记录)
  • 我的职能:

    $merge = array();
    foreach ($new as $ikey => $ival) {
        $ispid = (isset($ival['pid'])) ? (int) $ival['pid'] : 0;
        if ($ispid === 0) {
            $merge[] = $ival;
        }
        if ($ispid > 0) {
            $exist = false;
            foreach ($db as $rkey => $rval) {
                $rspid = (int) $rval['pid'];
                if ($ispid === $rspid) {
                    $spid_exist = true;
                    overridePriceValue($ival, $rval);
                    $merge[] = $rval;
                }
            }
    //        if ($exist === false) {
    //            echo "price id " . $ispid . " is not match with any special prices.";
    //        }
        }
    }
    
    function overridePriceValue($input_spc_price, &$spc_price) {
        if (isset($input_spc_price['stay'])) {
            $spc_price['stay'] = $input_spc_price['stay'];
        }
        if (isset($input_spc_price['end'])) {
            $spc_price['end'] = $input_spc_price['end'];
        }
        if (isset($input_spc_price['start'])) {
            $spc_price['start'] = $input_spc_price['start'];
        }
        if (isset($input_spc_price['normal_price'])) {
            $spc_price['normal_price'] = $input_spc_price['normal_price'];
        }
        if (isset($input_spc_price['promo_price'])) {
            $spc_price['promo_price'] = $input_spc_price['promo_price'];
        }
        if (isset($input_spc_price['resell_price'])) {
            $spc_price['resell_price'] = $input_spc_price['resell_price'];
        }
    }
    
    我需要你的建议来实现这个目标。谢谢:)

    您可以使用来自另一个stackoverflow问题的UDF(感谢jwueller),并按如下方式进行操作:

    $merge = $new;
    
    foreach($db as $item) {
        if (!in_array_r($item["pid"], $new)) {
            $merge[] = $item;
        }
    }
    
    function in_array_r($needle, $haystack, $strict = false) {
        foreach ($haystack as $item) {
            if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
                return true;
            }
        }
    
        return false;
    }
    

    什么是
    $merge=$new,是新的空数组吗?我试过了。