Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Arraybaum durchlaufen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Arraybaum durchlaufen


 
skrejci
11-07-2006, 21:37 
 
Hallo!

Neu hier, aber ein bisschen PHP programmieren hab ich schon gelernt :-| Allerdings stehe ich jetzt vor dem Problem, dass ich in einem Array zu einem gegebenen Wert alle "Vorgängerwerte" der jeweils nächsthöheren Ebenen herauskitzeln muss. Das Array schaut z.B. so aus:

Array
(
[1] => dfb974b9e24231948369297ba5ff6ce5
[2] => Array
(
[5] => a63caba97e021bf69cb4091a6c2b44ce
[6] => Array
(
)
[9] => c6e1ebf22d68a828226836c6efa64c81
[10] => Array
(
)
[14] => e50fc57c0b0dbe58f4e5ace5e31e7213
[15] => Array
(
)
)
[19] => bd0dbb6c2d7e6aae3751359215c9c326
[20] => Array
(
[22] => b10723f5b0dbafefc70a71c953cb8c0e
[23] => Array
(
)
)
)


Die Werte sind jeweils zur Laufzeit generierte md5-Schlüssel. Auch die Keys werden erst zur Laufzeit zugewiesen.
Wenn ich z.B. den Wert für Key 9: c6e1ebf22d68a828226836c6efa64c81 gegeben habe, brauche ich die jeweiligen Knoten der jeweils höheren Ebene. In diesem Fall also
- c6e1ebf22d68a828226836c6efa64c81
- dfb974b9e24231948369297ba5ff6ce5

Das Array ist aber nicht notwendigerweise auf 2 Ebenen beschränkt, sondern kann beliebig tief gehen.

Gibts dafür 'ne Lösung?

Danke, Stefan

 
onemorenerd
11-07-2006, 21:53 
 
Kurze Nachfrage: Willst du alle Elemente der übergeordneten Dimension oder nur die, deren Index kleiner ist?

Auf dein Beispiel bezogen: Du hast Array[2][9] in der Hand. Die übergeordnete Dimension ist Array[x]. Möchtest du nun davon alle Elemente (alle Array[x][y], die nicht selbst wieder Arrays sind) oder nur die "kleineren" (alle Array[x][y], die nicht selbst wieder Arrays sind und für die x < 2 gilt)?

Also möchtest du nur dfb974b9e24231948369297ba5ff6ce5 oder auch bd0dbb6c2d7e6aae3751359215c9c326?

 
skrejci
11-07-2006, 22:01 
 
Danke der Nachfrage - da hab ich mich nicht ordenltich ausgedrückt:

Ich will NUR den Weg zum Ziel, im Fall des Beispiels nur das Element ([1] =>) dfb974b9e24231948369297ba5ff6ce5 und das gegebene Element selbst.

Bedenke aber, dass ich abgesehen vom Array und dem gegebenen Value keinerlei Informationen habe (insb. aktuelle Zeiger im Array)!

Danke! Stefan

 
onemorenerd
11-07-2006, 22:25 
 
Weil du grad am Lernen bist, hier erstmal ein möglicher Ansatz - falls du es nicht ausprogrammiert bekommst, poste deinen Code und wir sehen weiter.

Also los gehts. Wir besorgen erstmal einen Zeiger auf den gesuchten Schlüssel s. Da s beliebig tief in der Hierarchie stehen kann, bietet sich eine rekursive Funktion an.
Diese Funktion könnte die "Index-Spur" x->y->z für Array[x][y][z] = s zurückgeben oder lieber nur den Zeiger auf Array[x] und den Wert y.

Der Rest ist ein Kinderspiel: Mit einer Schleife gehen wir über alle Elemente von Array[x], deren Index kleiner als y ist und ziehen alle String-Elemente heraus.

 
skrejci
11-07-2006, 23:23 
 
Danke für die Infos!
Mein Gedanken-Haken war der, dass jede Ebene ihren eigenen Zeiger hat. Aber genau das rettet mich ja jetzt. Der Code so far:

function GetPath($sval, $arr, &$res) {
static $gef = false; // true, wenn sval gefunden wurde

reset($arr); // setzt Zeiger im aktuellen Array auf den Anfang
do { // Schleife mind. 1x durchlaufen
if (is_array(current($arr))) { // ist Knoten ein Array? Wenn ja, ...
GetPath($sval, current($arr), $res); // ... dann nächste Ebene durchsuchen
if ($gef) { // wenn gefunden, dann im Rücklauf alle Knoten-Values dranhängen
$res .= "###".prev($arr); //Value immer eine Pos vor dem Array-Knoten
} //if ($gef)
} else { // Wenn kein Array, dann...
if ((!$gef) && ($sval == current($arr))) { //... auf $sval prüfen
$gef = true; // wenn gefunden, $gef auf true setzen, und...
$res = current($arr); // ... den Value (=$sval) ins Ergebnis schreiben
}
} //if (!is_array(...
} while ((!$gef) && (next($arr) !== false));
} //GetPath

GetPath('c6e1ebf22d68a828226836c6efa64c81', $x, $res); // Beispielaufruf
$path = array_reverse(explode("###", $res)); // Aus dem Ergebnis ein Array extrahieren,
// dieses umdrehen, damit aufsteigend sortiert
echo "<pre>";print_r($path);echo "</pre>"; // Beispiel-Ausgabe
///////////////////////// Ausgabe:
Array
(
[0] => dfb974b9e24231948369297ba5ff6ce5
[1] => c6e1ebf22d68a828226836c6efa64c81
)


Schönen Abend und THX noch mal! Stefan

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:05 Uhr.