将重复的关联数组值组合到附加的键中

时间:2012-04-10 17:14:48

标签: php arrays

我有一个像这样的数组(为了清晰起见而抽象):

$foo = array(
   'breakfast' => 'a daily meal',
   'lunch' => 'a daily meal',
   'dessert' => 'a special treat',
   'snack' => 'a special treat',
   'plates' => 'tableware'
);

我希望将重复值的所有键合并到一个“合并”键中 - 这样print_r($foo);就像这样:

Array
(
[breakfast|lunch] => 'a daily meal'
[dessert|snack] => 'a special treat'
[plates] => 'tableware'
)

目前,我正在通过一系列丑陋的foreach声明来完成这一切...是否有更简单/更合适的方式?

3 个答案:

答案 0 :(得分:1)

我是这么认为的。从您的$ foo开始,我们添加...

$collector = array();
$newFoo = array();
foreach ($foo as $key=>$value){
    if (isset($collector[$value])){
        $collector[$value] .= '|'.$key;
    } else {
        $collector[$value] = $key;
    }
}

foreach ($collector as $keyValue=>$itemIndex){
    $newFoo[$itemIndex] = $keyValue;
}

我的答案没有那么优雅,但它会完成工作。

答案 1 :(得分:1)

由于您正在对值进行“分组”,因此我构建了一个临时数组$result,将$foo中的值映射到$foo中的任何匹配键。有了它,很容易通过它们的值识别重复项并连接它们的键。最后array_flip将返回您正在寻找的内容。

function merge_values(array $arr) {
    $result = array();

    foreach ( $arr as $key => $val ) {
        if ( isset($result[$val]) )
            $result[$val] .= '|' . $key;
        else
            $result[$val] = $key;
    }

    return array_flip($result);
}

查看结果:http://ideone.com/iTUFY

array(3) {
  ["breakfast|lunch"]=>
  string(12) "a daily meal"
  ["dessert|snack"]=>
  string(15) "a special treat"
  ["plates"]=>
  string(9) "tableware"
}

答案 2 :(得分:0)

像这样,可能是:

$foo = array(
   'breakfast' => 'a daily meal',
   'lunch' => 'a daily meal',
   'dessert' => 'a special treat',
   'snack' => 'a special treat',
   'plates' => 'tableware'
);
$new = array();
foreach($foo as $key => $value){
    $keyNew = array_search($value,$new);
    if ($keyNew){
        unset($new[$keyNew]);
        $new[$keyNew . "|" . $key] = $value;
    }else
        $new[$key] = $value;
}
print_r($new);