Das Prinzip ansich ist mir schon klar gewesen.
Ging mir eher darum, dass man für gewöhnlich den inhalt und nicht die "beschreibung" abruft.
Also wenn man zb. die ID hat und die IP haben möchte.
Na schau dir doch mal das Objekt genauer an:
[src=javascript]
{ "4890105": {
"id": "4890105",
"type": "A",
"host": "",
"record": "95.215.46.193",
"ttl": "60"
},
"4890106": {
"id": "4890106",
"type": "A",
"host": "www",
"record": "95.215.46.193",
"ttl": "60"
}
}
[/src]
Der Inhalte, den du haben möchtest, ist record und du hast nun die ID.
Nehmen wir an, dass deine ID die 4890106 ist, dann wäre dein Pfad (durch das Objekt) der fett markierte.
Du greifst auf die Instanz zu, dort auf das mit 4890106 identifizierte Objekt und dort eben wiederum auf den record, welcher die IP enthält. "Gib mir von dem Objekt von dem Feld mit der ID 4890106 den Eintrag von record.
In deiner "Lösung" gehst du aber den anderen Weg, du suchst alle IDs, die zu einer IP gehören.
[src=php]
$json_array = json_decode( $server_output );
foreach ( $json_array as $dns_array => $stan ) {
$dns_id[$stan->record][] = $dns_array;
}
[/src]
Dein $server_output ist wahrscheinlich der String. (Ein json-Objekt ist übrigens eigentlich nur ein Array.)
Das foreach geht nun jedes Element durch, also in deinem Beispiel 4890105 und 4890106, wobei $dns_array entsprechend 4890105 bzw. 4890106 annimmt und $stan jeweils das Objekt dahinter also {"id":.., "type":.., "host":.., "record":.., "ttl":..}.
Gleichzeitig schreibt es ein neues Array $dns_id, welches als assoziativen Key des Arrays den record (dessen Eintrag) erhält und als "Wert" die ID.
Deine Variable $dns_id sieht also später so aus:
[src=php]$dns_id["95.215.46.193"][0] = "4890105"; // die IP als explizite Indexierung mittels $stan->record, 0 durch implizite Indexierung
$dns_id["95.215.46.193"][1] = "4890106"; // die IP als explizite Indexierung mittels $stan->record, 1 durch implizite Indexierung[/src]
bzw. so:
[src=php]$dns_id = array ( "95.215.46.193" => array( 0 => "4890105", 1 => "4890106") );[/src]
Im weiteren Verlauf schreibst du dann das innere Array in $dns:
[src=php]$dns = $dns_id["95.215.46.193"];[/src]
Was nichts anderes bedeutet als:
[src=php]$dns = array( 0 => "4890105", 1 => "4890106");[/src]
Mit deiner While-Schleife läufst du entsprechend durch das Array und lässt dir die 4890105 bzw 4890106 ausgeben.
Die while-Schleife finde ich persönlich jetzt nicht so gut gelungen, dafür gibt es auch for bzw. noch besser foreach, bei letzterem hast du auch keine Probleme mit der Abbruchbedingung oder nicht stetiger Indexierung.
Einfacher wäre es natürlich, dir direkt alle ID's ausgeben zu lassen, die eine bestimmte IP identifizieren:
[src=php]$given_by_server = '{"4890105":{"id":"4890105","type":"A","host":"","record":"95.215.46.193","ttl":"60"},"4890106":{"id":"4890106","type":"A","host":"www","record":"95.215.46.193","ttl":"60"}}';
$needle = "95.215.46.193"; // IP, deren Einträge gesucht werden
$json_obj = json_decode($given_by_server);
foreach($json_obj as $id => $obj)
{
if($obj->record == $needle)
{
echo 'ID: ' . $id . '<br>';
}
}[/src]
Fehler sind vorbehalten.