PHPの多次元配列について初歩的な質問があります。


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

良い方法がございましたら、ご教授をお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/12/29 16:33:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント27pt

対象を探すだけなら下記のような具合になります。

$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])] : '該当なし';

PHP: array_search - Manual


用途と環境にもよりますが連想配列にしてしまったほうが楽かもしれません。

(下記はphp5以降です。php4環境では連想配列化は少し手間です。)

PHP: array_combine - Manual


その他、配列を扱う関数の一覧と詳細が下記にありますので、

お時間できたときにでも、一通り眺めてみてください。

PHP: 配列 関数 - Manual


※本日はそろそろ布団に入りますので、以後の回答は翌日以降になります。

id:cochoo

遅くにご回答いただきありがとうございます。

ご提案いただいたプログラムでこちらの要望は満たせることができました。

ありがとうございました。

ちなみに、先にも書かせていただいたのですが、同じキー('apple'など)が複数出現する場合、

array_searchは最初にマッチしたもの、array_combineは最後にマッチしたものが有効となり、

なぜか仕様がまちまちで使いづらいのが難点です。

array_searchでご紹介いただいたHPからarray_keysという関数を見つけ、それで検出したものを参照していくというのが実用的と思います。

array_searchというのは知らなかったので参考になりました。

2009/12/24 03:11:24

その他の回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント27pt

という多次元配列(連想配列ではありません)において、

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

PHP: array_combine - Manual

id:cochoo

ご回答ありがとうございます。

もう1点、よろしいでしょうか?

仮に'apple'が2個あったとします。この場合、array_combineだと最後にマッチしたもの、

つまり、1個目の'apple'の情報が2個目の'apple'の情報に上書きされて、配列から消されてしまいます。

この問題を解決する方法がございましたら、よろしくお願いいたします。

質問の際に、複数個あることが書かれていなかったため、ご迷惑をおかけして申し訳ありません。

2009/12/24 02:54:35
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301ここでベストアンサー

ポイント27pt

対象を探すだけなら下記のような具合になります。

$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])] : '該当なし';

PHP: array_search - Manual


用途と環境にもよりますが連想配列にしてしまったほうが楽かもしれません。

(下記はphp5以降です。php4環境では連想配列化は少し手間です。)

PHP: array_combine - Manual


その他、配列を扱う関数の一覧と詳細が下記にありますので、

お時間できたときにでも、一通り眺めてみてください。

PHP: 配列 関数 - Manual


※本日はそろそろ布団に入りますので、以後の回答は翌日以降になります。

id:cochoo

遅くにご回答いただきありがとうございます。

ご提案いただいたプログラムでこちらの要望は満たせることができました。

ありがとうございました。

ちなみに、先にも書かせていただいたのですが、同じキー('apple'など)が複数出現する場合、

array_searchは最初にマッチしたもの、array_combineは最後にマッチしたものが有効となり、

なぜか仕様がまちまちで使いづらいのが難点です。

array_searchでご紹介いただいたHPからarray_keysという関数を見つけ、それで検出したものを参照していくというのが実用的と思います。

array_searchというのは知らなかったので参考になりました。

2009/12/24 03:11:24
id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59

ポイント26pt

連想配列を使って値を配列にしてはどうでしょう。

値を取り出す際、[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);

ミソは[]の部分。こうすると配列の最後の要素として追加してくれます。

キー(添え字)の省略

id:cochoo

さっそくご回答いただきあリがとうございます。

ご連絡が遅くなり本当に申し訳ありません。

ご指摘の方法は、こちらの希望にすごく近いのです。

ミソのついては知りませんでした。よい方法ですね。

ありがとうございました。

2009/12/29 16:30:28

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません