Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Moin,

ich hab folgendes Problem mit meinem PHP. Ich habe ein Mehrdimensionales Array, dieses muss verändert werden. Klingt soweit ganz einfach. Jetzt kommt aber der Knackpunkt, zB muss mittendrin eines der Arrays heraus und das darunter auf die Ebene geschoben werden. Erklären ist gut. Zeigen ist besser.

Array nach Abruf:

Array
(
[1] => Array
(
[id] => 1
[name] => Test
[ueber] => 0
[anzahl] => 1
[subrubriken] => Array
(
[2] => Array
(
[id] => 2
[name] => Test1Sub1
[ueber] => 1
[anzahl] => 0
[subrubriken] => Array
(
[6] => Array
(
[id] => 6
[name] => Test1Sub1Sub1
[ueber] => 2
[anzahl] => 2
[subrubriken] =>
)

)

)

)

)

[3] => Array
(
[id] => 3
[name] => Test2
[ueber] => 0
[anzahl] => 0
[subrubriken] => Array
(
[4] => Array
(
[id] => 4
[name] => Test2Sub1
[ueber] => 3
[anzahl] => 1
[subrubriken] =>
)

[5] => Array
(
[id] => 5
[name] => Test2Sub2
[ueber] => 3
[anzahl] => 0
[subrubriken] =>
)

)

)

)[/PHP]

Array wie es sein soll nach Bearbeitung

[PHP]Array
(
[1] => Array
(
[id] => 1
[name] => Test
[ueber] => 0
[anzahl] => 1
[subrubriken] =>
)

[4] => Array
(
[id] => 4
[name] => Test2Sub1
[ueber] => 3
[anzahl] => 1
[subrubriken] =>
)

)

Ich weiß, dass ich das Rekursiv lösen muss (so wie schon den Zusammenbau), aber ich komme auf keinen grünen Zweig. Und nein beim Zusammenbau selber ist das frickeln noch nicht möglich. ich brauche erst alle Rubriken, da ja die ganz unten höher rutschen sollen, wenn die darüber nichtgefüllt sind (steht in anzahl).

Hoffe ihr habt da ne Lösung?

Geschrieben

Moin,

wird ja als Baumsturktur implementiert, nur vorher müssen eben die rausgekickt werden, die leer sind. Ich hab übrigends die Antwort.

private function dropKey($arr){
if(!empty($arr)){
foreach ($arr as $key => $val){
$newarr = $this->dropKey($arr[$key]["subrubriken"]);
if ($val["anzahl"]==0){
if(!empty($newarr)){
foreach ($newarr as $newkey=>$newval){
$arr[$newkey] = $newval;
}
unset($arr[$key]);
} else {
return;
}
}
else {
$arr[$key]["subrubriken"] = $newarr;
}
}
return $arr;
} else {
return;
}
} [/PHP]

Geschrieben

Hallo,

warum gehst Du nicht rekusiv durch:

Du liest den Baum von der Wurzel, wenn Du die Node erreichst, z.B. der Keyname (persönlich würde ich mit IDs arbeiten), musst du doch nur alle Kindknoten durchlaufen und ihnen als Elternknoten die ID des Parents deiner aktuellen Node geben, danach löschst Du die Node, auf der Du stehst.



function delnode($node, $id) {

if $node == null

   return;


if $node.id == $id 

   foreach($node.childs as $child)

       $child.parentid = $node.parentid;

   delete($node)

else

   foreach($node.childs as $child)

        delnode($child, $id)

}

Meine Ansicht nach, benötigst Du nicht das Element "anzahl" in Deinem Array, da Du Dir über count(<Array>) die Elementanzahl des Arrays geben lassen kannst. Mit is_array(<array>) kannst du prüfen, ob sich in deinem Feld "subrubriken" ein Array befindet, falls nicht ist es ein Blatt in deinem Baum und du musst nicht weiter traversieren.

Aber wirklich der Tipp, lege Deine Baumstruktur wirklich als solche ab. Das Array lohnt sich nur für binäre Baume, da man sie iterativ traversieren kann.

Schreibe Dir eine Klasse Node, die als Eigenschaften eine eine ID (Objekt Hash) besitzt über die Du sie identifizieren kannst, eine Namen, sprich das was Du visuell benötigst, ein Datenfeld für die Daten und ein Array in das Du die Kindknoten füllst. Um Deinen Baum zu speichern kannst ihn z.B. serialisieren http://de2.php.net/manual/de/language.oop.serialization.php

Es ist wirklich sinnvoll vorher sich Gedanken um die Repräsentation der Daten zu machen

Phil

Geschrieben

Moin,

danke für deine weitere EInbringung. Aber Anzahl hat nicht direkt was mit dem Array zu tun, sondern gibt die Anzahl der Einträge in der Rubik wieder ;)

Deshalb brauch ich die Zahl. Und deshalb soll das Array bei anzahl 0 auch rausgeshcmissen werden. Wie gesagt funktioniert die von mir gepostete Lösung einwandfrei

Seperator

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...