按值合并两个数组

时间:2013-09-02 13:04:27

标签: php arrays sorting

我有这个数组:

$mergedItems = array(
  0 => array(
    'id_item' => 'AZ-110'
    'amount' => 12
  ),
  1 => array(
    'id_item' => 'BZ-110',
    'amount' => 13
  ),
  2 => array(
    'id_item' => 'BZ-210',
    'amount' => 28
  ),
  3 => array(
    'id_item' => 'CZ-291',
    'amount' => 11
  )
);

数组

$items = array(
  0 => array(
    'number' => 'AZ-110'
  ),
  1 => array(
    'number' => 'BZ-110'
  ),
  2 => array(
    'number' => 'CZ-291'
  ),
  3 => array(
    'number' => 'BZ-210'
  )
);

现在我想要的是按id_item值排序第一个数组,以匹配与第二个数字相同的顺序。

结果数组必须包含第二个数组的所有值和第一个数组的所属量值。不得保留钥匙!

我无法使用array_merge,因为第二个数组有更多动态的项目,所以我只想要第一个数组中第一个数据集中的所有项目。

有人明白我的意思吗?我正在寻找一种快速且非肮脏的方式来获得预期的结果。

/编辑:

预期数组:

$detailedItems = array(
  0 => array(
    'number' => 'AZ-110',
    'amount' => 12
  ),
  1 => array(
    'number' => 'BZ-110',
    'amount' => 13
  ),
  2 => array(
    'number' => 'CZ-291',
    'amount' => 11
  ),
  3 => array(
    'number' => 'BZ-210',
    'amount' => 28
  )
);

4 个答案:

答案 0 :(得分:0)

据我所知,没有真正的“非脏”(意思是单行)方式,但这个功能应该有效:

$out = array();
foreach ($mergedItems as $key => $value) {
    if (array_key_exists($key, $detailedItems)) { // Make sure it exists to prevent errors
        $out[$key] = $detailedItems[$key] + array('amount' => $value['amount']);
    } else {
        $out[$key] = $value['amount'];
    }
}
print_r($out);

答案 1 :(得分:0)

$temp = $items;

foreach($temp as &$val)
{
     foreach($mergedItems as $item)
     {
         if($item['id_item'] == $val['number'])
         {
             $val['amount'] = $item['amount'];
             break;
         }
     }
}

print_r($temp);

答案 2 :(得分:0)

PHP 5.5解决方案:

$itemMap = array_flip(array_column($mergedItems, 'id_item'));
$result = array_map(
    function($i) use($itemMap, $mergedItems) { 
        return $mergedItems[$itemMap[$i['number']]];
    },
    $items);

print_r($result);

对于5.3< = PHP< 5.5您只需将array_map替换为array_column

$itemMap = array_flip(array_map(
    function($i) { return $i['id_item']; },
    $mergedItems));

如何运作

我们的想法是为$mergedItems内的索引创建项目编号的地图,即

[
    'AZ-100' => 0,
    'BZ-110' => 1,
    'BZ-210' => 2,
    // etc
]

有了这些信息,就可以很容易地迭代$items(以便根据该数组对结果进行排序)并从$mergedItems中选择适当的元素以便每次追加到结果中

答案 3 :(得分:0)

您可以尝试以下代码:

foreach ($mergedItems as $item) {
    $merged[$item['id_item']] = array('amount' => $item['amount']);
}

foreach ($items as $item)
{
    $detailedItems[] = array_merge($item, $merged[$item['number']]);
}

输出

var_dump($detailedItems);

array (size=4)
  0 => 
    array (size=2)
      'number' => string 'AZ-110' (length=6)
      'amount' => int 12
  1 => 
    array (size=2)
      'number' => string 'BZ-110' (length=6)
      'amount' => int 13
  2 => 
    array (size=2)
      'number' => string 'CZ-291' (length=6)
      'amount' => int 11
  3 => 
    array (size=2)
      'number' => string 'BZ-210' (length=6)
      'amount' => int 28