2012-04-10 75 views
1

我有一个数组像这样(抽象为清楚起见):重复ASSOC数组值组合成一个附加的键

$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语句完成这个......是有更简单的/更合适的方法?

回答

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" 
} 
+0

所有这些解决方案都是比我在做什么好,但关键是'array_flip' - 我错过了这个功能,这实际上是我试图完成的。感谢指针。 – k3davis 2012-04-13 18:09:28

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; 
} 

我的回答没有太多优雅,但它会完成工作。

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);