1

私はそのような配列を持っています(明確にするために抽象化されています):

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

重複する値のすべてのキーを1つの「マージされた」キーに結合しprint_r($foo);たいので、次のようになります。

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

現在、私はこれを長いネストされた一連の醜いforeachステートメントを通じて達成しています...より簡単でより適切な方法はありますか?

4

3 に答える 3

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

私の答えにはあまり優雅さはありませんが、それは仕事を成し遂げるでしょう。

于 2012-04-10T17:32:50.163 に答える
1

値を「グループ化」しているため、値をの一致するキーに$resultマップする一時配列を作成しました。これにより、値によって重複を識別し、それらのキーを連結することが簡単になりました。最後のは、探しているものだけを返します。$foo$fooarray_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"
}
于 2012-04-10T17:32:53.090 に答える
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);
于 2012-04-10T17:35:41.640 に答える