Ik probeer met wat code een array van data te doorlopen en niet relevante data te verwijderen.

Een array zit er als volgt uit:


[6] => Array
(
[710C27E0-822A-4513-9D44-D97E929484A9] => Array
(
[documents] => Array
(
[0] => error message
)

)

)


Ik gebruik onderstaande code:

<?php
class report {
private static $instance;
private $data = array();

private function __construct() { }

private function __clone() { }

public function __destruct() { }

public static function singleton() {
if (!isset(self::$instance))
self::$instance = new self();

return self::$instance;
}

public function check() {
foreach($this->data as $key => &$values) {
foreach($values as $k => &$value) {
/* some checks */

if($return != null)
$values[$return] = $values[$k];

unset($values[$k]);
}
}
}

public function __toString() {
print_r($this->data);
return '';
}
}
?>

$return is een guid uit een andere database.
Wanneer ik een local variable namaak in de functie met de zelfde data als in $this->data worden de elementen wel verwijderd. Wanneer ik $data = $this->data doe werkt het niet.

Wanneer ik bovenstaande check functie vervang door onderstaande code werkt het wel, maar ik ben op zoek naar een betere/mooiere en vooral snellere oplossing.

<?php
public function check() {
$_data = json_encode($this->data);
$data = json_decode($_data);

foreach($data as $key => &$values) {
foreach($values as $k => &$value) {
/* some checks */
if($return != null)
$values->$return = $values->$k;

unset($values->$k);
}
}
$this->data = $data;
}
?>
Het ziet er nodeloos ingewikkeld uit... wat is een guid? een random gegenereerd id toch? waarom noem je die dan $return? Noem m dan gewoon $guid!

Zelf zou ik ervoor kiezen om gewoon een nieuw eigen object/array te vullen met data die ik nodig heb in plaats van met allerlei trucs elementen te gaan unsetten. Zolang je dat in een functie doet en je de 'input' object/array in die functie declareert dan zal bij het verlaten van die functie het geheugen voor dat object/array ook weer vrijgegeven worden.'

Wat is het nut van data eerst omzetten naar JSON om het vervolgens op de volgende regel terug te zetten?
Kun je niet beter de JSON decoden naar een array in plaats van een object?

<?php
$data = json_decode($_data, true);
?>

[size=xsmall]Toevoeging op 07/10/2014 12:05:50:[/size]

<?php
function getData($json)
{
$arr= json_decode($json, true);

return array(
'watiknodigheb' => $arr['bleh']['blah'],
'watiknogmeernodigheb' => $arr['troep']
);
}
?>
Een guid is een inderdaad een random id zoals "710C27E0-822A-4513-9D44-D97E929484A9". Ik heb niet de precieze code hier geplakt vandaar dat de naamgeving misschien iets verwarrend is.

De eerste array aan data word uit een database gehaald en daarna gecheckt of het in een andere database zit vandaar..

Blijkbaar gaat het met json_decode($_data, true); ook niet.. zou het kunnen liggen dat unset niet om kan gaan met een guid als key? daar begint het namelijk wel op te lijken, hoe raar dat misschien ook is..
unset kan alleen variabelen en array elementen laten verdwijnen. De inhoud van zo een variabele heeft daar niets mee te maken.
<?php
var_dump($values);
print_r($values["710C27E0-822A-4513-9D44-D97E929484A9"]);
?>

returns:

<?php
array(1) {
["710C27E0-822A-4513-9D44-D97E929484A9"]=>
array(1) {
["documents"]=>
array(1) {
[0]=>
string(12) "gonna expire"
}
}
}
PHP Notice: Undefined index: 710C27E0-822A-4513-9D44-D97E929484A9
?>

Niet te begrijpen hier..

[size=xsmall]Toevoeging op 07/10/2014 13:13:42:[/size]


	public function log($id, $guid, $job, $message) {
		$this->data[$id][$guid][$job][] = $message;
	}





SOLVED maar onbegrijpelijk..

als ik guid var_dump in de log functie krijg ik:
string(36) "710C27E0-822A-4513-9D44-D97E929484A9"

vervolgens heb ik toch (string) ervoor gezet om alles uit te sluiten.

var_dump((string)$guid);
string(36) "710C27E0-822A-4513-9D44-D97E929484A9"

en nu werkt het.

Reageren