今の配列の持ち方だと効率化はできません。
もし$arr
が DB から取り出した値なのであれば、取り出すときの構造を工夫すれば効率の良い取り出しができるかと。
追記
興味本位で、配列の持ち方の変更まで含めてパフォーマンスがどうなるか、コードを書いてみました。
php
1<?php
2function test_in_array($arr, $list){
3 $res = [];
4 foreach($arr as $value){
5 if(in_array($value[0], $list)){
6 $res[] = $value;
7 }
8 }
9 return $res;
10}
11
12function test_foreach($arr, $list){
13 $res = [];
14 foreach ($arr as $value){
15 foreach($list as $num){
16 if($value[0]===$num){
17 $res[] = $value;
18 }
19 }
20 }
21 return $res;
22}
23
24function test_sort($arr, $list){
25 $res = [];
26 foreach($arr as $value){
27 if(!isset($tmp[$value[0]])){
28 $tmp[$value[0]] = [];
29 }
30 $tmp[$value[0]][] = $value;
31 }
32 foreach($list as $num){
33 if(isset($tmp[$num])){
34 $res[] = $tmp[$num];
35 }
36 }
37 return $res;
38}
39
40foreach([[10000, 10], [1000, 10], [10000, 100], [100000, 100],] as [$arr_max, $list_max]){
41 $arr = [];
42 for($i = 0; $i < $arr_max; $i++){
43 $arr[] = [
44 rand(0, 100),
45 'hoge',
46 'fuga',
47 ];
48 }
49
50 $list = [];
51 for($i = 0; $i < $list_max; $i++){
52 $list[] = rand(0, 100);
53 }
54 echo 'test : arr_max = ' . $arr_max . ', list_max = ' . $list_max . PHP_EOL;
55 foreach(['test_in_array', 'test_foreach', 'test_sort'] as $func){
56 $time_start = microtime(true);
57 $func($arr, $list);
58 $time = microtime(true) - $time_start;
59 printf("$func \t %.7f 秒\n",$time);
60 }
61}
in_array が圧倒的に早いかと思ってましたが、そうでもないですね。
php
1test : arr_max = 10000, list_max = 10
2test_in_array 0.0011530 秒
3test_foreach 0.0019360 秒
4test_sort 0.0010860 秒
5test : arr_max = 1000, list_max = 10
6test_in_array 0.0000391 秒
7test_foreach 0.0001721 秒
8test_sort 0.0000541 秒
9test : arr_max = 10000, list_max = 100
10test_in_array 0.0010500 秒
11test_foreach 0.0152941 秒
12test_sort 0.0007241 秒
13test : arr_max = 100000, list_max = 100
14test_in_array 0.0273101 秒
15test_foreach 0.1742241 秒
16test_sort 0.0325580 秒
やはり実測してみると面白いです。
paiza.io を使用したので計測値は結構揺れました。(timeout するんで、回数も絞ってますw)
多分、php のバージョンによっても異なるはずなので、自身の環境で確認してみてください。
さらに追記
php
1<?php
2function test_in_array($arr, $list){
3 $res = [];
4 foreach($arr as $value){
5 if(in_array($value[0], $list)){
6 $res[] = $value;
7 }
8 }
9 return $res;
10}
11
12function test_array_key_exists($arr, $list){
13 $list2 = array_fill_keys($list, TRUE);
14 $res = [];
15 foreach($arr as $value){
16 if(array_key_exists($value[0], $list2)){
17 $res[] = $value;
18 }
19 }
20 return $res;
21}
22
23function test_foreach($arr, $list){
24 $res = [];
25 foreach ($arr as $value){
26 foreach($list as $num){
27 if($value[0]===$num){
28 $res[] = $value;
29 }
30 }
31 }
32 return $res;
33}
34
35function test_sort($arr, $list){
36 $res = [];
37 foreach($arr as $value){
38 if(!isset($tmp[$value[0]])){
39 $tmp[$value[0]] = [];
40 }
41 $tmp[$value[0]][] = $value;
42 }
43 foreach($list as $num){
44 if(isset($tmp[$num])){
45 $res[] = $tmp[$num];
46 }
47 }
48 return $res;
49}
50
51foreach([[10000, 10], [1000, 10], [10000, 100], [100000, 100],] as [$arr_max, $list_max]){
52 $arr = [];
53 for($i = 0; $i < $arr_max; $i++){
54 $arr[] = [
55 rand(0, 100),
56 'hoge',
57 'fuga',
58 ];
59 }
60
61 $list = [];
62 for($i = 0; $i < $list_max; $i++){
63 $list[] = rand(0, 100);
64 }
65
66 echo 'test : arr_max = ' . $arr_max . ', list_max = ' . $list_max . PHP_EOL;
67 foreach(['test_in_array', 'test_foreach', 'test_sort', 'test_array_key_exists'] as $func){
68 $time_start = microtime(true);
69 $func($arr, $list);
70 $time = microtime(true) - $time_start;
71 printf("$func \t %.7f 秒\n",$time);
72 }
73}
test : arr_max = 10000, list_max = 10
test_in_array 0.0010860 秒
test_foreach 0.0018811 秒
test_sort 0.0021858 秒
test_array_key_exists 0.0003760 秒
test : arr_max = 1000, list_max = 10
test_in_array 0.0000389 秒
test_foreach 0.0001709 秒
test_sort 0.0000539 秒
test_array_key_exists 0.0000341 秒
test : arr_max = 10000, list_max = 100
test_in_array 0.0010271 秒
test_foreach 0.0149219 秒
test_sort 0.0006859 秒
test_array_key_exists 0.0004339 秒
test : arr_max = 100000, list_max = 100
test_in_array 0.0258038 秒
test_foreach 0.1712370 秒
test_sort 0.0291610 秒
test_array_key_exists 0.0179920 秒
結論:array_key_exists() は早い!w
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/30 01:15