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

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

ただいまの
回答率

90.83%

  • PHP

    18703questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 149

SugiuraY

score 172

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

$array
(
    [0] => Array
        (
            [0] => A
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
            [5] => 5
            [6] => 6
        )

    [1] => Array
        (
            [0] => B
            [1] => 7
            [2] => 8
            [3] => 9
            [4] => 10
            [5] => 11
            [6] => 12
        )
)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

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

$keyToIndexHash = array();
for ($i=0; $i<count($array); $i++) {
  $keyToIndexHash[$array[i][0]] = $i;
}

$searchIndex = $keyToIndexHash["B"];
var_dump($array[$searchIndex]);


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/15 11:59

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

    キャンセル

checkベストアンサー

+1

$array=[
["A",1,2,3,4,5,6],
["B",7,8,9,10,11,12],
["C"],
["D"],
["E"],
  ];

$keyword="B";
$key=key(array_filter($array,function($x) use($keyword){
return $x[0]==$keyword;
}));
print $key;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/14 16:40

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

    (もちろん本件のようにarray_filterを使えばよいのに敢えて位置からforループやforeachとifを組み合わせて一致するものの添字を探し出すようなことはしないのですが)

    キャンセル

  • 2017/12/14 17:14

    なにか適当なデバッガやプロファイラを使えば内部処理の追跡が
    できるような気がしますが、内部処理をトレースしても
    なにか最適化ができるわけではないのであまり気にしても
    しかたないのでは?

    もちろんロジックを極めたいということであれば今回提示のものより
    理論的にもっとよい処理はいくつか考えつきますが
    汎用的である程度高速な処理となると内部関数にまさるものは
    なかなか提示できですね

    たとえば今回のものだと、foreachのループ処理を利用した場合
    前から順に走査してヒットした時点で検索処理をやめてしまえば
    少しは処理が短縮されます
    ただそれがarray_filterのロジックより優秀かどうかは怪しいし
    汎用性についても微妙です

    キャンセル

  • 2017/12/15 11:54

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

    キャンセル

+1

連想配列が今後膨大になっていくと全てループさせると処理が重くなるのではと
懸念している次第でございます。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PHPを用いた記号の入力制限

    PHPで入力された記号を受け取り、キーコードに変換するコードを作成しています。 変換後にjsで実際の入力制限をかけるのですが、どうにも冗長なコードになってしまっています。 何か

  • 解決済

    多次元配列Aを配列Bの順を条件にして並べ替えたい

    以下のように配列Bを条件に多次元配列Aを並べ替えたいです。 何かいい方法はあるでしょうか。 //多次元配列 $arrayA = array( arr

  • 解決済

    PHPのSwitch文をコンパクトにする方法

    前提・実現したいこと 初心者で申し訳ありません。 都道府県すべてのあるデータを取得しているのですが、 コードをご覧のとおり、東北地方のeq()変数は(2,4,5)で、関東が(

  • 解決済

    配列から検索して別の配列に入れたい

    連想配列がありその中で特定のキーと値が同じ配列を別の配列に入れなおしたいと考えています(下記例になります)。いろいろやってみたのですが、うまくいきませんでした。何かいい方法はないで

  • 解決済

    for文をネスト化する場合

    お世話になります。 for文をネストで使用する場合、以下のコードのようにドットで連結して使用することはできないようですが、(条件式や処理の中の数字をループさせる) なにか方法は

  • 解決済

    php 配列

    初心者で恐縮ですがご教授ください。 $Aの配列を$Bのように、特定のキーの値が同じだった場合(ここでは名前の佐藤)、特定のキーの配列のみをピックアップし(実際には配列内には複

  • 解決済

    標準入力のすべての行を取得する

    前提・実現したいこと 入力値 勇者 戦士 出力値 勇者さん 戦士さん 発生している問題・エラーメッセージ 出力結果 Arrayさん Arrayさん 該当のソースコード <

  • 解決済

    php 配列の値が連番かどうかの判定

    0 =>  array (size=1) 'id' => int 1 1 =>  array (size=1) 'id' => int 3 2 =>  array (size=1)

同じタグがついた質問を見る

  • PHP

    18703questions

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