$a = Array ( [0]
=> Array ( [0] => 'apple'
[1] => 'orange'
[2] => 'grape' )
Array ( [1]
=> Array ( [0] => 'red'
[1] => 'yellow'
[2] => 'purple' )
}
という多次元配列(連想配列ではありません)において、
apple => red
orange => yellow
grape => purple
というように検索を行いたいのですが、以下のような処理ではなく、
なにかPHPの標準関数や技法を使って簡単に検索できないかと苦慮しています。
$i = 0;
foreach ($a[0] as $fruits) {
switch ($fruites) {
case 'apple' :
case 'orange' :
case 'grape' :
$color = $a[1][$i];
break;
}
$i++;
}
良い方法がございましたら、ご教授をお願いいたします。
対象を探すだけなら下記のような具合になります。
$a = Array(Array('apple', 'orange', 'grape'),Array('red', 'yellow', 'purple')); //$b = 'grape'; $b = 'Strawberry'; if ($i = array_search($b, $a[0])) { echo $a[1][$i]; } else { echo '該当無し'; }
3項演算にすれば、一行に出来なくもないけれど、
検索が二度になるので効率いいとは言えないですね。
(私が知らないだけで、検索は1回に出来るのかもしれませんが・・・。)
echo array_search($b, $a[0]) ? $a[1][array_search($b, $a[0])] : '該当なし';
用途と環境にもよりますが連想配列にしてしまったほうが楽かもしれません。
(下記はphp5以降です。php4環境では連想配列化は少し手間です。)
その他、配列を扱う関数の一覧と詳細が下記にありますので、
お時間できたときにでも、一通り眺めてみてください。
※本日はそろそろ布団に入りますので、以後の回答は翌日以降になります。
という多次元配列(連想配列ではありません)において、
PHP において配列と連想配列に区別はないのだがね。
apple => red
orange => yellow
grape => purple
というように検索を行いたいのですが
「検索」という言葉の意味がそれではよくわからんのだが以下のコードで
用は足りると思うがどうか?
$a = Array ( [0] => Array ( [0] => 'apple' [1] => 'orange' [2] => 'grape' ) Array ( [1] => Array ( [0] => 'red' [1] => 'yellow' [2] => 'purple' ) }; $result = array_combine($a[0],$a[1]); var_dump($result);
ご回答ありがとうございます。
もう1点、よろしいでしょうか?
仮に'apple'が2個あったとします。この場合、array_combineだと最後にマッチしたもの、
つまり、1個目の'apple'の情報が2個目の'apple'の情報に上書きされて、配列から消されてしまいます。
この問題を解決する方法がございましたら、よろしくお願いいたします。
質問の際に、複数個あることが書かれていなかったため、ご迷惑をおかけして申し訳ありません。
対象を探すだけなら下記のような具合になります。
$a = Array(Array('apple', 'orange', 'grape'),Array('red', 'yellow', 'purple')); //$b = 'grape'; $b = 'Strawberry'; if ($i = array_search($b, $a[0])) { echo $a[1][$i]; } else { echo '該当無し'; }
3項演算にすれば、一行に出来なくもないけれど、
検索が二度になるので効率いいとは言えないですね。
(私が知らないだけで、検索は1回に出来るのかもしれませんが・・・。)
echo array_search($b, $a[0]) ? $a[1][array_search($b, $a[0])] : '該当なし';
用途と環境にもよりますが連想配列にしてしまったほうが楽かもしれません。
(下記はphp5以降です。php4環境では連想配列化は少し手間です。)
その他、配列を扱う関数の一覧と詳細が下記にありますので、
お時間できたときにでも、一通り眺めてみてください。
※本日はそろそろ布団に入りますので、以後の回答は翌日以降になります。
遅くにご回答いただきありがとうございます。
ご提案いただいたプログラムでこちらの要望は満たせることができました。
ありがとうございました。
ちなみに、先にも書かせていただいたのですが、同じキー('apple'など)が複数出現する場合、
array_searchは最初にマッチしたもの、array_combineは最後にマッチしたものが有効となり、
なぜか仕様がまちまちで使いづらいのが難点です。
array_searchでご紹介いただいたHPからarray_keysという関数を見つけ、それで検出したものを参照していくというのが実用的と思います。
array_searchというのは知らなかったので参考になりました。
連想配列を使って値を配列にしてはどうでしょう。
値を取り出す際、[0]の様にどの要素を取り出すのか指定しないといけないのが難点ですが。
<?php $a['apple'][] = 'red'; $a['orange'][] = 'yellow'; $a['grape'][] = 'purple'; $colors = $a['apple']; var_dump($colors); $a['apple'][] = 'blue'; $colors = $a['apple']; var_dump($colors);
ミソは[]の部分。こうすると配列の最後の要素として追加してくれます。
さっそくご回答いただきあリがとうございます。
ご連絡が遅くなり本当に申し訳ありません。
ご指摘の方法は、こちらの希望にすごく近いのです。
ミソのついては知りませんでした。よい方法ですね。
ありがとうございました。
遅くにご回答いただきありがとうございます。
ご提案いただいたプログラムでこちらの要望は満たせることができました。
ありがとうございました。
ちなみに、先にも書かせていただいたのですが、同じキー('apple'など)が複数出現する場合、
array_searchは最初にマッチしたもの、array_combineは最後にマッチしたものが有効となり、
なぜか仕様がまちまちで使いづらいのが難点です。
array_searchでご紹介いただいたHPからarray_keysという関数を見つけ、それで検出したものを参照していくというのが実用的と思います。
array_searchというのは知らなかったので参考になりました。