我有一个像这样的数组(为了清晰起见而抽象):
$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声明来完成这一切...是否有更简单/更合适的方式?
答案 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);
}
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);