0

ここvar_dumpに私の配列があります:

array(6) {
    [0]=> string(4) "quack"
    ["DOG"]=> string(4) "quack"
    [1]=> string(4) "quack"
    ["CAT"]=> string(4) "quack"
    [2]=> string(4) "Aaaaarrrrrggggghhhhh"
    ["CAERBANNOG"]=> string(4) "Aaaaarrrrrggggghhhhh"
}

(ただの楽しみのために、このコードに 2 つの駄洒落を含めました。探してみてください!)

この配列を 2 つの配列に分割するにはどうすればよいですか。一方にはすべてのquacks が含まれます。他のAaaaarrrrrggggghhhhh


常に連続した順序であるとは限らないことに注意してください。そのため、次のようなネストされたハッシュマップを考えていました。

  1. 小切手if (isset($myarr['$found_val']))
  2. 見つかった場合はその配列を追加します
  3. それ以外の場合は、新しい配列でその場所を作成します

しかし、配列がどのように実装されているかわからないので、O(n) を追加する可能性があります。その場合、他の解決策が必要になります...

4

3 に答える 3

1

これを試して

$quacks_arr = array_intersect($your_array, array('quack'));
$argh_arr   = array_intersect($your_array, array('Aaaaarrrrrggggghhhhh'));

それらを並べ替えたい場合は、 ksort を実行してください

ksort($quacks_arr);
ksort($argh_arr);
于 2012-10-13T13:59:44.497 に答える
1

値に基づいてそれらをグループ化し、キーを保存するだけです

$array = array(0 => "quack","DOG" => "quack",1 => "quack","CAT" => "quack",2 => "Aaaaarrrrrggggghhhhh","CAERBANNOG" => "Aaaaarrrrrggggghhhhh");

$final = array();
foreach ( $array as $key => $value ) {
    if (! array_key_exists($value, $final)) {
        $final[$value] = array();
    }
    $final[$value][] = $key;
}

var_dump($final);

出力

array
  'quack' => 
    array
      0 => int 0
      1 => string 'DOG' (length=3)
      2 => int 1
      3 => string 'CAT' (length=3)
  'Aaaaarrrrrggggghhhhh' => 
    array
      0 => int 2
      1 => string 'CAERBANNOG' (length=10)
于 2012-10-13T11:42:00.267 に答える
1

誰かがこれをもっと奇妙な方法でやりたい場合に備えて:

の代わりに単一の項目配列のみを使用するという air4x のアイデアで更新されましarray_fill(0,count($a),$v)た。それははるかに賢明です。

$a = array(
  0 => "quack",
  "DOG" => "quack",
  1 => "quack",
  "CAT" => "quack",
  2 => "Aaaaarrrrrggggghhhhh",
  "CAERBANNOG" => "Aaaaarrrrrggggghhhhh"
);

$b = array();
foreach( array_unique(array_values($a)) as $v ) {
  $b[$v] = array_intersect($a, array($v));
}

echo '<xmp>';
print_r($b);

完全に最適ではありません -読みにくい- それでも興味深い :)

于 2012-10-13T11:59:01.877 に答える