Čudan PHP bug izazvan sa "&$row"

Naletih na čudan bug u PHPu, uopće ne kužim uzrok…a nekako mi se čini da je sam PHP uzrok. Hmm…ambiciozno je okriviti PHP, ali fakat ne kužim.

Nastojao sam izabciti sve suvišno i ogoliti maksimalno code a da zadržim neočekivano ponašanje…pa code slijedi:

		$send = [];
		$r = [
			'first'=>[
				['ime'=>'ana','age'=>20],
				['ime'=>'ivo','age'=>21]
			], 
			'second'=>[
				['ime'=>'ela','age'=>22],
				['ime'=>'mia','age'=>23]
			]
		];


		foreach ($r as $dataKey => $item) {


			$data = [];

			foreach ($item as $key => $row) {
				$data[]=$row;
			}

			decho("data", $data);  //decho je logiranje podataka

			foreach ($data as &$row) {
				$row["test"] = 100;
				decho('row', $row);
			}

			decho("dataKey: ".$dataKey." ... AND data: ".toJS($data));

			$send[$dataKey] = $data;

			decho("send", $send);
		}

		return $send;

Kako radim logiranje, evo i loga:

data: [{"ime":"ana","age":20},{"ime":"ivo","age":21}]
row: {"ime":"ana","age":20,"test":100}
row: {"ime":"ivo","age":21,"test":100}
dataKey: first ... AND data: [{"ime":"ana","age":20,"test":100},{"ime":"ivo","age":21,"test":100}]
send: {"first":[{"ime":"ana","age":20,"test":100},{"ime":"ivo","age":21,"test":100}]}
data: [{"ime":"ela","age":22},{"ime":"mia","age":23}]
row: {"ime":"ela","age":22,"test":100}
row: {"ime":"mia","age":23,"test":100}
dataKey: second ... AND data: [{"ime":"ela","age":22,"test":100},{"ime":"mia","age":23,"test":100}]
send: {"first":[{"ime":"ana","age":20,"test":100},{"ime":"mia","age":23}],"second":[{"ime":"ela","age":22,"test":100},{"ime":"mia","age":23,"test":100}]}

Očekivao bi na kraju da je send:
{"first":[{"ime":"ana","age":20,"test":100},{"ime":"ivo","age":21, "test":100}],"second":[{"ime":"ela","age":22,"test":100},{"ime":"mia","age":23,"test":100}]}

A iz nekog razloga, kao što log prikazuje, zagubi se ivo, također na tom itemu gdje bi trebao biti ivo, tamo nije zakačen “test” attribut kao na svima ostalima.

Hmmm…

P.S. funkcija koja logira “decho”, nema nikakav utjecaj na algoritam. Ista greška se dešavala i bez toga logiranja.

		$send = [];
		$r = [
			'first'=>[
				['ime'=>'ana','age'=>20],
				['ime'=>'ivo','age'=>21]
			], 
			'second'=>[
				['ime'=>'ela','age'=>22],
				['ime'=>'mia','age'=>23]
			]
		];


		foreach ($r as $dataKey => $item) {


			$data = [];

			foreach ($item as $key => $row) {
				$data[]=$row;
			}

			decho("data", $data);  //decho je logiranje podataka

			foreach ($data as &$row) {
				$row["test"] = 100;
				decho('row', $row);
			}
            unset($row);

			decho("dataKey: ".$dataKey." ... AND data: ".toJS($data));

			$send[$dataKey] = $data;

			decho("send", $send);
		}

		return $send;

Ovako radi :slight_smile:

Neko ko poznaje PHP bolje od mene moze vjerovatno objasniti detaljnije o cemu se radi ovdje.

1 Like

Skužio sam i ja par načina kako će to raditi…ali sam nakon toga išao ogoliti code koliko sam već znao eliminirati nebitno, s namjerom da zadržim neočekivano ponašanje i da seciram uzrok.

Dobre linkove si našao…ali kako god, izdokumentirano to ili ne od strane PHP …to je hebiga vrlo neželjeno ponašanje, ili ti ga BUG.

PHP Bug Tracking System

^
Za prijavu bug-ova.
Uvijek se rado smijemo u PHP chat sobi kakvih gluposti od prijedloga zna stići.