現在の言語: 日本語

戻る

配列内検索(1)
配列関連

配列をfor文で検索する場合
配列の一部をunsetで削除した場合はエラーの原因となります。
PHPの配列は順番が保証されています。
順序付きマップで実装されており、foreachは、この仕組みを利用しています。
そのため、for文を使用するよりforeachの方が安全に実行できます。

[サンプル]

copy
class test1
{
	function test1()
	{
		$ary =[1, 2, 3];
		$value = 3;
		echo "searchFor(value:$value):".$this->searchFor($ary, $value).PHP_EOL;//1
		$value = 4;
		echo "searchFor(value:$value):".$this->searchFor($ary, $value).PHP_EOL;//0
		$value = 3;
		echo "searchForEach(value:$value):".$this->searchForEach($ary, $value).PHP_EOL;//1
		$value = 4;
		echo "searchForEach(value:$value):".$this->searchForEach($ary, $value).PHP_EOL;//0
		$value = 3;
		echo "searchForEachIndex(value:$value):".$this->searchForEachIndex($ary, $value).PHP_EOL;//2
		$value = 4;
		echo "searchForEachIndex(value:$value):".$this->searchForEachIndex($ary, $value).PHP_EOL;//-1
	}
	private function searchFor(array $ary, int $value):int
	{
		$exists = 0;
		for($i=0; $i $num)
		{
			if($value===$num)
			{
				$index =$idx;
				break;
			}
		}
		return $index;
	}
	function test2()
	{
		$ary =[1, 2, 3];
		unset($ary[1]);//要素を削除
//要素の1を削除したためエラーとなります。
/*
		for($i=0; $i < count($ary); $i++)
		{
			echo "i:$i ary:".$ary[$i].PHP_EOL;
		}
i:0 ary:1
Warning:  Undefined array key 1
*/
		$index = 0;
		foreach($ary as $num)
		{
			echo "index:$index ary:".$num.PHP_EOL;
			$index++;
		}
/*
index:0 ary:1
index:1 ary:3
*/
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";
copy
class test1
{ 
	function test1() 
	{ 
		$ary =[1, 2, 3]; 
		$value = 3; 
		echo "searchFor(value:$value):".$this->searchFor($ary, $value).PHP_EOL;//1 
		$value = 4; 
		echo "searchFor(value:$value):".$this->searchFor($ary, $value).PHP_EOL;//0 
		$value = 3; 
		echo "searchForEach(value:$value):".$this->searchForEach($ary, $value).PHP_EOL;//1 
		$value = 4; 
		echo "searchForEach(value:$value):".$this->searchForEach($ary, $value).PHP_EOL;//0 
		$value = 3; 
		echo "searchForEachIndex(value:$value):".$this->searchForEachIndex($ary, $value).PHP_EOL;//2 
		$value = 4; 
		echo "searchForEachIndex(value:$value):".$this->searchForEachIndex($ary, $value).PHP_EOL;//-1 
	} 
	private function searchFor(array $ary, int $value):int 
	{ 
		$exists = 0; 
		for($i=0; $i $num)
		{
			if($value===$num)
			{
				$index = $idx;
				break;
			}
		}
		return $index;
	}
	function test2()
	{
		$ary = [1, 2, 3];
		unset($ary[1]); //Delete element
		//An error occurs because element 1 was deleted.
/* 
		for($i=0; $i < count($ary); $i++) 
		{ 
			echo "i:$i ary:".$ary[$i].PHP_EOL; 
		}
i:0 ary:1
Warning: Undefined array key 1
*/ 
		$index = 0; 
		foreach($ary as $num) 
		{ 
			echo "index:$index ary:".$num.PHP_EOL; 
			$index++; 
		}
/*
index:0 ary:1
index:1 ary:3
*/ 
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";

searchForEachIndex関数
内部インデックス番号を取得する方法です。

PHPの配列は、内部的には「順序付きマップ」として実装されています。
foreach は常に「配列が保持している順序」通りに処理します。
PHPの配列は内部的に「ハッシュテーブル」という構造を使っているため
for文をtest2のように実行して
unsetでキーを削除するとハッシュテーブルの問い合わせが失敗します。
そのため、問い合わせたキーがないためエラーを返します。

PHPの内部イメージ
データの順番は双方向連結リストの順番を保持しており
前のデータや次のデータという内容を把握できるようになっています。
そのため、unsetでキーを削除しても破番を飛ばして次のデータと結びます。
インデック:0
インデック:1(欠番)
インデック:2
この場合、インデック:0→インデック:2
という順番に移動します。


戻る

著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。