2012-04-10 7 views
1

私は、配列のようなので、(明確にするために抽象化)している:追加キー

$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

値を「グループ化」するので、$fooの値を$fooの一致するキーにマップした$resultという一時的な配列を作成しました。これにより、重複をその値で識別し、それらのキーを連結するのは簡単でした。最後に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

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); 
関連する問題