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

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

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

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

Q&A

3回答

17927閲覧

2次元配列の2次元目の値でarray_search

avantgarden

総合スコア121

PHP

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

0グッド

1クリップ

投稿2016/07/31 05:39

編集2022/01/12 10:55

2次元配列の2次元目の値をみて、それが全体の配列の何番目かを出したいです。
具体例としては

$test_array = array( [0]=> array ( ["hoge"]=>'fuga1', ["hogehoge"]=>'fugafuga1 ), [1]=> array { ["hoge"]=>'fuga2', ["hogehoge"]=>'fugafuga2' ) )

という配列で、hogeがfuga2なのは何番目か。
この場合、ほしい結果はint(1)です。

array_search('fuga1', $test_array); とすればfalseが返ってくるのはわかるのですが、
何か決まったやり方、あるいはうまいやり方があれば教えていただきたいです。

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

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

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

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

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

guest

回答3

0

組み込み関数一発で決まるようなやり方が無ければ,一番効率のいいやり方はforeachを使う方法であるというのがPHPの常です.

php

1$offset = false; 2foreach ($test_array as $offset => $child) { 3 if ($child['hoge'] === 'fuga2') { 4 break; 5 } 6 $offset = false; 7} 8var_dump($offset);

効率度外視でよければarray_columnを使うといいと思います.

php

1$offset = array_search('fuga1', array_column($test_array, 'hoge'), true);

余談ですが,array_searchの第3引数は必ずtrueにしましょう.in_arrayについての注意喚起がありますが,array_searchについても同様です.

投稿2016/07/31 06:10

mpyw

総合スコア5223

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

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

avantgarden

2016/07/31 06:14

ありがとうございます。 「効率度外視」とは、array_columnを使った方法だと処理が遅いということでしょうか。
mpyw

2016/07/31 06:18

ループ回数を考えれば自明です.要素数がnであるとすると,array_column+array_searchが要素を参照する回数は最良でn+1回,最悪で2n回になります.foreachを使えば最良で1回,最悪でn回になります.(値を探す場合は順番に見ていくしか無いですが,キーで探す場合はハッシュ関数のおかげで一瞬で探せるので,そこは無視できます)
mpyw

2016/07/31 06:21

要素数が十分に少ない(今回の処理なら,あくまで個人的な目安ですが多くても300程度)ならコードの美しさ優先で,それを超えてくるなら妥協してforeachを使うといいと思います.
coba-coba

2016/07/31 07:43

具体例から考えると、 var_dump(mb_substr("fuga2", -1, 1, "utf-8") - 1); が最速かつきれいだと思います。 汎用性が低いですが。
coba-coba

2016/07/31 07:52

すみませんやっぱりこれは無いですね。 数字が1桁のときしか使えないし、考え方も天邪鬼的なので…。
mpyw

2016/07/31 07:55

↑うーん,なぜここでsubstr系の関数が出てくるのか意味がわかりません… 質問の意図は「2次元配列の2次元目の値をみて、それが全体の配列の何番目かを出したいです」ということあって,fuga2はあくまで値の例に過ぎません.「fuga2から1という数字を作りたいです」という質問ではないです.
guest

0

動作確認してませんが、こんな感じのはどうでしょう。

PHP

1<?php 2// $test_array は定義済みとして 3 4function geth($ar) { 5 return $ar['hoge']; 6} 7 8$res = array_search('fuga2', array_map("geth", $test_array)); 9?>

array_mapで hoge の一覧を作って、その中から fuga2 を探す、と。

投稿2016/07/31 06:51

takasima20

総合スコア7458

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

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

mpyw

2016/07/31 06:57

array_columnの劣化ですね…
takasima20

2016/07/31 07:12

げげ。array_column調べずに書いたのがバレバレですな。
asahina_dev

2016/07/31 07:17

そして Please, don't invent your own implementation of array_column(). The author of this function already provides a version written in plain PHP. ともいわれてるね(w
guest

0

http://php.net/manual/ja/function.array-search.php

上記のページに、array_columnを使った方法の記載がありました。

投稿2016/07/31 06:08

avantgarden

総合スコア121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問