ある2つの値のペア$x,$y
が、最初に与えられた複数のペアのデータの中に含まれるかどうかを検索したい時
最初のデータを$arr
に格納しておくとする。
方法1
function check_element_exists($arr, $x, $y) {
for ($i = 0; $i < count($arr); $i++) {
if ($arr[$i][0] == $x && $arr[$i][1] == $y) {
return true;
}
}
return false;
}
この方法は配列の要素数が多い場合、処理に時間がかかる。
方法2
function check_element_exists($arr, $x, $y) {
return isset($arr[$x][$y]);
}
isset関数を使って要素を探索する場合には、要素の有無を高速に判定することができる。
検証方法
microtime関数で実行時間を比較してみる。
コードは、chatGPT先生にご協力いただいた。
<?php
function check_element_exists1($arr, $x, $y) {
for ($i = 0; $i < count($arr); $i++) {
if ($arr[$i][0] == $x && $arr[$i][1] == $y) {
return true;
}
}
return false;
}
function check_element_exists2($arr, $x, $y) {
return isset($arr[$x][$y]);
}
// 検証用の多次元配列を生成する
$arr = [];
for ($i = 0; $i < 1000; $i++) {
for ($j = 0; $j < 1000; $j++) {
$arr[$i][$j] = rand(0, 100000);
}
}
$arr[123][0] = 500; // 存在する要素を設定する
$arr[123][1] = 500; // 存在する要素を設定する
$arr[500][500] = 12345; // 存在する要素を設定する
// 方法1を実行する
$start_time1 = microtime(true);
$result1 = check_element_exists1($arr, 500, 500);
$end_time1 = microtime(true);
$elapsed_time1 = $end_time1 - $start_time1;
var_dump($result1);
echo "<br>";
echo "方法1: " . $elapsed_time1 . "秒<br>";
// 方法2を実行する
$start_time2 = microtime(true);
$result2 = check_element_exists2($arr, 500, 500);
$end_time2 = microtime(true);
$elapsed_time2 = $end_time2 - $start_time2;
var_dump($result2);
echo "<br>";
echo "方法2: " . $elapsed_time2 . "秒<br>";
?>
結果
bool(true)
方法1: 3.6001205444336E-5秒
bool(true)
方法2: 2.8610229492188E-6秒