1

我有这个数组:

$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

4 回答 4

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);
于 2013-09-02T13:20:51.417 回答
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
于 2013-09-02T13:27:20.907 回答
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);
于 2013-09-02T13:16:49.727 回答
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_maparray_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每次从中选择适当的元素附加到结果中。

于 2013-09-02T13:23:17.037 回答