質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

216閲覧

連想配列において特定の要素を持つ添字を取得する

SugiuraY

総合スコア317

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/12/14 07:20

下記のような連想配列で
・$array[$i][0]=B時の添字[1]を取得したい
・$array[$i][0]は必ず一意である
良い方法はございますでしょうか?
全てループを回して検索した結果を取得することはできると思うのですが
連想配列が今後膨大になっていくと全てループさせると処理が重くなるのではと
懸念している次第でございます。
宜しくお願い申し上げます。

PHP

1$array 2( 3 [0] => Array 4 ( 5 [0] => A 6 [1] => 1 7 [2] => 2 8 [3] => 3 9 [4] => 4 10 [5] => 5 11 [6] => 6 12 ) 13 14 [1] => Array 15 ( 16 [0] => B 17 [1] => 7 18 [2] => 8 19 [3] => 9 20 [4] => 10 21 [5] => 11 22 [6] => 12 23 ) 24)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

アクセスの速さを求めるのであれば

php

1$keyToIndexHash = array(); 2for ($i=0; $i<count($array); $i++) { 3 $keyToIndexHash[$array[i][0]] = $i; 4} 5 6$searchIndex = $keyToIndexHash["B"]; 7var_dump($array[$searchIndex]);

のように、探したいキーとインデックス番号の対応を連想配列に保存しておけば、ループして探すより圧倒的に早く検索できます。

ただし連想配列を用意する時間が別に必要になりますので、1度しか検索しないなら連想配列を用意する時間+キーを探す時間の合計はループして探すより増えると思います。

投稿2017/12/14 09:52

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2017/12/15 02:59

コメント有難うございます。 このような方法はこれまで思いついたこともなかったのです。 連想配列を用意する処理についてはどの程度のものなのかを個別に調べてみようと思います。
guest

0

連想配列が今後膨大になっていくと全てループさせると処理が重くなるのではと

懸念している次第でございます。

こういったケースは DB に突っ込むことを検討したほうが良いと思いますよ。
そうすると処理もきれいに書けますし^^

投稿2017/12/15 03:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

PHP

1$array=[ 2["A",1,2,3,4,5,6], 3["B",7,8,9,10,11,12], 4["C"], 5["D"], 6["E"], 7 ]; 8 9$keyword="B"; 10$key=key(array_filter($array,function($x) use($keyword){ 11return $x[0]==$keyword; 12})); 13print $key;

投稿2017/12/14 07:29

yambejp

総合スコア114810

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2017/12/14 07:40

yambi様 いつもご回答有難うございます。 解決方法につきましては、十分理解できました。 一点、素朴な疑問があり、もしご存知であればお伺いしたいのですが、このようなphpに組み込まれた関数も内部的にはループをさせて処理しているため、同じような動作をさせるような自己定義関数を作成したとしても、処理動作については大きく相違しないのでしょうか?。それともやはり組込関数は有能で無駄なループ処理等を内部で行っていないため、目的を達成するための組込関数があれば処理の観点からは当然積極的にこちらを採用すべきなのでしょうか? (もちろん本件のようにarray_filterを使えばよいのに敢えて位置からforループやforeachとifを組み合わせて一致するものの添字を探し出すようなことはしないのですが)
yambejp

2017/12/14 08:14

なにか適当なデバッガやプロファイラを使えば内部処理の追跡が できるような気がしますが、内部処理をトレースしても なにか最適化ができるわけではないのであまり気にしても しかたないのでは? もちろんロジックを極めたいということであれば今回提示のものより 理論的にもっとよい処理はいくつか考えつきますが 汎用的である程度高速な処理となると内部関数にまさるものは なかなか提示できですね たとえば今回のものだと、foreachのループ処理を利用した場合 前から順に走査してヒットした時点で検索処理をやめてしまえば 少しは処理が短縮されます ただそれがarray_filterのロジックより優秀かどうかは怪しいし 汎用性についても微妙です
SugiuraY

2017/12/15 02:54

コメントありがとうございます。 いつも処理を考える際には内部関数を探したりするのですが、もう自分で作ったほうが早いと思うことがあります。ただそれでも処理速度があまりにも異なるのであれば、それでも内部関数で処理できないかを検討すべきかと判断に迷っておりました。コメントは大変に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問