現在の言語: 日本語

戻る

多次元配列の要素更新
配列関連

多次元配列の更新は要素をしていする方法があります。連想配列の多次元配列に更新にはarray_replace_recursiveを使い、差し替えた配列で返す方法もあります。

[サンプル]

copy
class test1
{
	function test1():void
	{
		$ary =[
			[1,2,3],
			[4,5,6],
			[7,8,9],
		];
		$ary[0][0]=100;
		$ary[0][1]=101;
		$ary[0][2]=102;
		for($i=0; $i<3; $i++)
		{
			if($i==1)
			{
				for($j=0; $j<3; $j++)
				{
					$ary[$i][$j]+=10;
				}
			}
		}
		print_r($ary);
	}
/*
Array
(
    [0] => Array
        (
            [0] => 100
            [1] => 101
            [2] => 102
        )

    [1] => Array
        (
            [0] => 14
            [1] => 15
            [2] => 16
        )

    [2] => Array
        (
            [0] => 7
            [1] => 8
            [2] => 9
        )

)
*/
	function test2():void
	{
		$ary = [
			"A" => [
				"up" => [1,2,3],
				"down" => [4,5,6]
			],
			"B" => [
				"up" => [11,12,13],
				"down" => [14,15,16]
			],
			"C" => [
				"up" => [21,22,23],
				"down" => [24,25,26]
			],
		];
		foreach ($ary as $key => &$data)// & を付けるのがポイント
		{
			if($key === "A")
			{
				$data["up"] = array_map(fn($v) => $v + 100, $data["up"]);
			}
			foreach($data["down"] as &$value)
			{
				$value += 10;
			}
		}
		print_r($ary);

		unset($value);//内側の参照解除
		unset($data);//外側の参照解除
	}
/*
Array
(
    [A] => Array
        (
            [up] => Array
                (
                    [0] => 101
                    [1] => 102
                    [2] => 103
                )

            [down] => Array
                (
                    [0] => 14
                    [1] => 15
                    [2] => 16
                )

        )

    [B] => Array
        (
            [up] => Array
                (
                    [0] => 11
                    [1] => 12
                    [2] => 13
                )

            [down] => Array
                (
                    [0] => 24
                    [1] => 25
                    [2] => 26
                )

        )

    [C] => Array
        (
            [up] => Array
                (
                    [0] => 21
                    [1] => 22
                    [2] => 23
                )

            [down] => Array
                (
                    [0] => 34
                    [1] => 35
                    [2] => 36
                )

        )

)
*/
	function test3():void
	{
		$ary = [
			"A" => [
				"up" => [1,2,3],
				"down" => [4,5,6]
			],
			"B" => [
				"up" => [11,12,13],
				"down" => [14,15,16]
			],
			"C" => [
				"up" => [21,22,23],
				"down" => [24,25,26]
			],
		];
		$tmp=[];
		$tmp=$ary["C"]["up"];
		foreach ($tmp as &$value)
		{
			$value += 100;
		}
		/*
		array_mapを使用して1行で計算する書き方
		$tmp = array_map(fn($v) => $v + 100, $ary["C"]["up"]);
		*/
		print_r($tmp);
		$aryNew = [
			"C" => ["up" => $tmp], // Cのupのみ更新
		];
		// 深い階層まで比較して上書きしてくれる
		$ary = array_replace_recursive($ary, $aryNew);
		print_r($ary);
	}
/*
Array
(
    [A] => Array
        (
            [up] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

            [down] => Array
                (
                    [0] => 4
                    [1] => 5
                    [2] => 6
                )

        )

    [B] => Array
        (
            [up] => Array
                (
                    [0] => 11
                    [1] => 12
                    [2] => 13
                )

            [down] => Array
                (
                    [0] => 14
                    [1] => 15
                    [2] => 16
                )

        )

    [C] => Array
        (
            [up] => Array
                (
                    [0] => 1000
                    [1] => 2000
                    [2] => 3000
                )

            [down] => Array
                (
                    [0] => 24
                    [1] => 25
                    [2] => 26
                )

        )

)
*/
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
$cls1->test3();
echo "</pre>";
copy
class test1
{ 
	function test1():void 
	{ 
		$ary =[ 
		[1,2,3], 
		[4,5,6], 
		[7,8,9], 
		]; 
		$ary[0][0]=100; 
		$ary[0][1]=101; 
		$ary[0][2]=102; 
		for($i=0; $i<3; $i++) 
		{ 
			if($i==1) 
			{ 
				for($j=0; $j<3; $j++) 
				{ 
					$ary[$i][$j]+=10; 
				} 
			} 
		} 
		print_r($ary); 
	}
/*
Array
( 
[0] => Array 
( 
[0] => 100 
[1] => 101 
[2] => 102 
) 

[1] => Array 
( 
[0] => 14 [1] => 15
[2] => 16
)

[2] => Array
(
[0] => 7
[1] => 8
[2] => 9
)

)
*/
	function test2():void
	{
		$ary = [
			"A" => [
				"up" => [1,2,3],
				"down" => [4,5,6]
			],
			"B" => [
				"up" => [11,12,13],
				"down" => [14,15,16]
			],
			"C" => [
				"up" => [21,22,23],
				"down" => [24,25,26]
			],
		];
		foreach ($ary as $key => &$data)// The key is the &.
		{
			if($key === "A")
			{
				$data["up"] = array_map(fn($v) => $v + 100, $data["up"]);
			}
			foreach($data["down"] as &$value)
			{
				$value += 10;
			}
		}
		print_r($ary);
		
		unset($value); // Inner dereference
		unset($data); // Outer dereference
	}
/*
Array
(
[A] => Array
(
[up] => Array
(
[0] => 101
[1] => 102
[2] => 103
)

[down] => Array
(
[0] => 14
[1] => 15
[2] => 16
)

)

[B] => Array
(
[up] => Array
(
[0] => 11 
[1] => 12 
[2] => 13 
) 

[down] => Array 
( 
[0] => 24 
[1] => 25 
[2] => 26 
) 

) 

[C] => Array 
( 
[up] => Array 
( 
[0] => 21 
[1] => 22 
[2] => 23 
) 

[down] => Array 
( 
[0] => 34 
[1] => 35 
[2] => 36 
) 

)

)
*/ 
	function test3():void 
	{ 
		$ary = [ 
			"A" => [ 
				"up" => [1,2,3], 
				"down" => [4,5,6] 
			], 
			"B" => [ 
				"up" => [11,12,13],
				"down" => [14,15,16]
			],
			"C" => [
				"up" => [21,22,23],
				"down" => [24,25,26]
			],
		];
		$tmp=[];
		$tmp=$ary["C"]["up"];
		foreach ($tmp as &$value)
		{
			$value += 100;
		}
		/*
		One-line calculation using array_map
		$tmp = array_map(fn($v) => $v + 100, $ary["C"]["up"]);
		*/
		print_r($tmp);
		$aryNew = [
			"C" => ["up" => $tmp], // Updates only the up value of C
		];
		// Compares and overwrites even deep within the hierarchy
		$ary = array_replace_recursive($ary, $aryNew); 
		print_r($ary); 
	}
/*
Array
( 
[A] => Array 
( 
[up] => Array 
( 
[0] => 1 
[1] => 2 
[2] => 3 
) 

[down] => Array 
( 
[0] => 4 
[1] => 5 
[2] => 6 
) 

) 

[B] => Array 
( 
[up] => Array 
( 
[0] => 11 
[1] => 12 
[2] => 13 
) 

[down] => Array 
( 
[0] => 14 
[1] => 15 
[2] => 16 
) 

) 

[C] => Array 
( 
[up] => Array 
( 
[0] => 1000 
[1] => 2000 
[2] => 3000 
) 

[down] => Array 
( 
[0] => 24 
[1] => 25 
[2] => 26 
) 

)

)
*/
}
echo "<pre>";
$cls1= new test1();
$cls1->test1();
$cls1->test2();
$cls1->test3();
echo "</pre>";
$ary[$i][$j]+=10;
要素を指定して値を差し替えています。
このケースでは、指定の要素に10を加算した結果に差し替えています。

if($key === "A")
キーがAのみを対象としています。

$data["up"] = array_map(fn($v) => $v + 100, $data["up"]);
array_map関数を使用して元のデータに100を加算した結果を返して、差し替えています。

foreach($data["down"] as &$value)
{
  $value += 10;
}
down配列の中身を一つずつ更新

$ary = array_replace_recursive($ary, $aryNew);
array_replace_recursive は、「新しい値で上書きする(置換する)」ための関数です。
そのため「元の値に100を加算する」といった計算処理を直接行うことはできません。
この変更のためにワンクッションを置いて計算済み配列を準備したものと差し替える必要があります。


戻る

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