2015-06-11 75 views
1

从数据库中检索数据:合并两个数组合并相同的数据添加新的数据

$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', 
    ), 
), 

预期的结果:

$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', 
    ), 
), 

新阵列合并

$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', 
    ), 
), 

这些都是要求:

  1. 如果新的数组记录不具有PID(价格ID),那么它 视为新的数据。 (记录起始日期:2015-06-03,结束日期: 2015-06-03)
  2. 如果新数组中的记录具有pid并且与来自表的记录匹配,那么新记录的值将覆盖旧记录(记录具有PID:231096235和PID:231096236)
  3. 如果从数据库中记录有PID和不与新的数组,那么它应该被加入到新阵列的任何PID匹配(它shouldb与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']; 
    } 
} 

我需要你建议实现目标。谢谢:)

回答

1

您可以从另一个计算器问题使用UDF in_array_r(感谢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; 
} 
+0

什么'$合并= $新;',是新的空数组?我试过了。 –

+0

它的工作原理,$合并是一个克隆。谢谢。 –