現在の言語: 日本語

戻る

配列要素の上書き(2)
配列関連

配列要素を更新する処理のサンプルです。

[サンプル]

copy
class test1
{
	function test1():void
	{
		$user1 = ['name' => 'tanaka', 'age' => 30];
		$user2 = ['name' => 'sato', 'age' => 25];
		
		$user = [];
		$user[] = $user1;
		$user[] = $user2;
		
		for ($i = 0; $i < count($user); $i++) {
			// $user[$i](各ユーザーの配列)の 'name' をチェック
			if (isset($user[$i]['name']) && $user[$i]['name'] === "sato") 
			{
				if (isset($user[$i]['age']))
				{
					$user[$i]['age'] = 20; // 元の配列を直接更新
				}
			}
		}
		
		print_r($user);
/*
Array
(
    [0] => Array
        (
            [name] => tanaka
            [age] => 30
        )

    [1] => Array
        (
            [name] => sato
            [age] => 20
        )

)
*/
	}
	function test2():void
	{
		$user1 = ['name' => 'tanaka', 'age' => 30];
		$user2 = ['name' => 'sato', 'age' => 25];
		
		$user = [];
		$user[] = $user1;
		$user[] = $user2;

		foreach ($user as &$tmp) { // & を使って直接参照する
			if (($tmp['name'] ?? '') === "sato") {
				$tmp['age'] = 20;
			}
		}
		
		print_r($user);
/*
Array
(
    [0] => Array
        (
            [name] => tanaka
            [age] => 30
        )

    [1] => Array
        (
            [name] => sato
            [age] => 20
        )

)
*/
		unset($tmp); // 参照を解除します
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";
copy
class test1
{
	function test1():void
	{
		$user1 = ['name' => 'tanaka', 'age' => 30];
		$user2 = ['name' => 'sato', 'age' => 25];
		
		$user = [];
		$user[] = $user1;
		$user[] = $user2;
		
		for ($i = 0; $i < count($user); $i++) 
		{
			// Check 'name' for $user[$i] (each user's array)
			if (isset($user[$i]['name']) && $user[$i]['name'] === "sato")
			{
				if (isset($user[$i]['age'])))
				{
					$user[$i]['age'] = 20; // Update the original array directly
				}
			}
		}
		
		print_r($user);
/*
Array
(
[0] => Array
(
[name] => tanaka
[age] => 30
)

[1] => Array
(
[name] => sato
[age] => 20
)

)
*/
	}
	function test2():void
	{
		$user1 = ['name' => 'tanaka', 'age' => 30];
		$user2 = ['name' => 'sato', 'age' => 25];
		
		$user = [];
		$user[] = $user1;
		$user[] = $user2;
		
		foreach ($user as &$tmp) { // Direct reference using &
			if (($tmp['name'] ?? '') === "sato") 
			{
				$tmp['age'] = 20;
			}
		}
		
		print_r($user);
/*
Array
(
[0] => Array
(
[name] => tanaka
[age] => 30
)

[1] => Array
(
[name] => sato
[age] => 20
)

)
*/
		unset($tmp); // Release reference
	}
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
echo "</pre>";

$user は「ユーザーの配列」を格納した多次元配列です。
条件判定や更新を行う際は、現在の要素である $user[$i] に対して行う必要があります。

isset()
変数が存在するか」を true/false で返す関数です。
値を比較する場合は、直接 == や === で比較します。

??(Null合体演算子)
このサンプルでは値が正しく入っているので問題ありませんが、
他のデータ連携により予期せぬデータが入っている可能性があります。
そのとき

$tmp['name']
のように実装した場合、予期せぬデータが入っていると
PHPは"Warning: Undefined array key" という警告を出してしまいます。
もしも、キーが存在しなくてもエラーを回避して安全に比較をすることができるように
Null合体演算子を使い処理を実装することが推奨されます。


戻る

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