• ベストアンサー

3つの連想配列を交互に代入して、新しい連想配列を作りたい

PHP Version 5.1.6を使っています。 それぞれの連想配列を先頭から順番に交互に代入したいのですが、 どのようなプログラムでできるのでしょうか? $arr1 = array(a1=>"aa1", a2=>"aa2", a3=>"aa3"); $arr2 = array(b1=>"bb1", b2=>"bb2", b3=>"bb3"); $arr3 = array(c1=>"cc1", c2=>"cc2", c3=>"cc3"); 代入後 $new_arr = array(  a1=>"aa1",  b1=>"bb1",  c1=>"cc1",  a2=>"aa2",  b2=>"bb2",  c2=>"cc2",  a3=>"aa3",  b3=>"bb3",  c3=>"cc3", );

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 まず連想配列に「先頭(或いは順番)」という概念はないのですが。 とりあえず…たとえばarray_keys関数を用いた復帰値の順番を仮に使うとして。 各配列が同じ要素数を持っていると仮定するなら、 $arr1_keys = array_keys($arr1); $arr2_keys = array_keys($arr1); $arr3_keys = array_keys($arr1); $count = count($arr1_keys); $new_arr = array(); while($count --) { $new_arr[$arr1_keys[$count]] = $arr1[$arr1_keys[$count]]; $new_arr[$arr2_keys[$count]] = $arr2[$arr2_keys[$count]]; $new_arr[$arr3_keys[$count]] = $arr3[$arr3_keys[$count]]; } 一応、このコードで「順番に交互に代入」は可能です。 でも、もう一度書いておきます。 連想配列に順番はありません。ですので、代入は交互に出来ても、たとえばforeachなどで「順番に出力されるか」は保証されません。

takagoo100
質問者

お礼

ご返答ありがとうございます。 できました。なるほど、キーだけ全部取得しちゃえば良かったんですね。 ところで、 >代入は交互に出来ても、たとえばforeachなどで「順番に出力されるか」は保証されません。 自分もそうだろうなぁとなんとなくですが思い、 順番を要する連想配列の使い方を諦めてたのですが、 どこかでPHPだけは代入した順番に表示されるとかなんとかいう記述を 見たことがあり、それでこれを利用したいと思い、使い始めました。 今のところ、代入した順番通りに表示されますし、問題はないように思えるのですが、 たとえばPHPでどのようなケースで起こりえるのでしょうか?

その他の回答 (1)

回答No.2

PHPではarrayとhashには違いがなく、どちらも配列データとして扱うようですね。 そのため、連想配列でもhash構造だけではなくて順序も保存するという少し不思議な特性があります。 そのため、ちょっと変更して $new_arr = array(); do{ if($x = each($arr1)) { $new_arr[$x['key']] = $x['value']; } if($y = each($arr2)) { $new_arr[$y['key']] = $y['value']; } if($z = each($arr3)) { $new_arr[$z['key']] = $z['value']; } }while($x || $y || $z); こんな感じにすると正しく動作するのではないかと思います。 ただしあまり一般的ではないと思いますので、素直に二次元配列などにして扱った方がいいと思います。

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、こちらのやり方でもできました。 >ただしあまり一般的ではないと思いますので、 >素直に二次元配列などにして扱った方がいいと思います。 たしかに・・・ プログラムで不安が残っちゃ駄目ですからね。