合并并重新排列嵌套的键/值

时间:2013-11-12 23:03:36

标签: php arrays

我有一个这样的数组:

array(
  0 => array(
    'name' => 'colors',
    'options' => array(
      array('name'=>'red', 'price'=>'2'),
      array('name'=>'blue', 'price'=>'3')
    )
  ),
  1 => array(
    'name' => 'sizes',
    'options' => array(
      array('name'=>'small', 'price'=>'5'),
      array('name'=>'large', 'price'=>'10')
    )
  ),
);

我想将所有嵌套选项数组的名称/价格合并为一个,所以它会是这样的:

array(
  'red' => '2',
  'blue' => '3',
  'small' => '5',
  'large' => '10'
);

我有一种感觉,这很简单,但我尝试的任何东西看起来都太复杂了。任何帮助将不胜感激。

...是的,我刚刚在不久前发布了几乎相同的问题。这有点不同,我首先要问的是 - 哎呀,对不起。

4 个答案:

答案 0 :(得分:1)

我不确定是否可以使用array_merge()array_combine()等内部方法来完成此操作,因为您的结构看起来非常特殊。但是如何迭代数组并自己构建一个新数组呢?

function customRearrange($arr) {
    $result = array();
    foreach ($arr as $group) {
        foreach ($group['options'] as $option) {
            // prevents values from being overwritten, uncomment if unwanted
            if (!array_key_exists($option['name'], $result))
                $result[ $option['name'] ] = $option['price'];
        }
    }
    return $result;
}

答案 1 :(得分:1)

您需要决定如何处理碰撞,无论如何这里都是相同的,这将为您提供正确的方向:

$newArray = array();
foreach ($array as $i => $item)
    foreach ($item['options'] as $j => $option)
        $newArray[$option['name']] = $option['price'];

答案 2 :(得分:0)

这是另一种方式,假设数组已分配给变量$a

<?php
for ($i = 0; $i < count($a); $i++) {
  $key = $a[$i]['name'];
  $options = $a[$i]['options'];
  for ($j = 0; $j <  count($options); $j++) {
    $optkey = $options[$j]['name'];
    $prices[$optkey] = $options[$j]['price'];
  }
}

print_r($prices);

答案 3 :(得分:0)

遍历嵌套数组中的“options”并创建一个新数组:

<?php
$arr = array(
  0 => array(
    'name' => 'colors',
    'options' => array(
      array('name'=>'red', 'price'=>'2'),
      array('name'=>'blue', 'price'=>'3')
    )
  ),
  1 => array(
    'name' => 'sizes',
    'options' => array(
      array('name'=>'small', 'price'=>'5'),
      array('name'=>'large', 'price'=>'10')
    )
  ),
);

$group = array();
foreach($arr as $a){
    foreach($a['options'] as $op){        
        $group[$op['name']] = $op['price'];        
}
}

print_r($group);

?>