Array-Werte rekursiv ändern

Hallo Newsgroup

Ich habe ein Array, zur Strukturierung und Steuerung von
Zugriffsrechten erzeugt.

[section_type] bezeichnet:
1 =3D Firma
2 =3D Abteilung in der Firma
3 =3D Produkt1
[section_level] bezeichnet die Verschactelungsebene
[section_right] ist das Zugriffsrecht, welches für den User gewährt
wurde.

####################################################
Auszug aus dem Array (welches per while-Schleife aus der Datenbank
gelesen wurde und in Wirklichkeit viel größer ist und noch tiefere
Verschachtelungen aufweist.

[structure] =3D> Array
(
[0] =3D> Array
(
[section_name] =3D> Musterunternehmen
[section_id] =3D> 14
[section_level] =3D> 1
[section_type] =3D> 1
[section_right] =3D> N
)

[1] =3D> Array
(
[section_name] =3D> Musterabteilung
[section_id] =3D> 101
[section_level] =3D> 2
[section_type] =3D> 2
[section_right] =3D> N
)

[2] =3D> Array
(
[section_name] =3D> Musterprodukt
[section_id] =3D> 545
[section_level] =3D> 3
[section_type] =3D> 3
[section_right] =3D> Y
)
}
#######################################################
Was ich schon hinbekommen habe, ist dass wenn bei einem Element mit
einem niedrigen section_level das section_right auf 'Y' gesetzt ist,
dass die darin liegenden Unterelemente ebenfalls dieses Recht ererben.

Im obigen Bespiel handelt es sich aber um einen Sonderfall.
Hier ist nämlich bei key [2] ein Produkt freigegeben, welches sich in
einer nicht freigegebenen Abteilung [1] und einer nicht freigegebenen
Firma [0] befindet.
Damit das Produkt angezeigt werden kann, müssen nun die darüber
liegenden Eltern-Elemente ebenfalls freigegeben werden.
Da bei dem Aufbau des Arrays in der Schleife, beim Schreiben des key
[3] die nicht-freigegebenen Elemente [0] + [1] bereits geschrieben
sind, kann ich (so denke ich) erst am Ende der Schleife das Array
nochmal durchgehen und deren section_right-Flags auf Y ändern.

Mit welcher Methode / PHP-Funktion könnte dies gemacht werden?

Danke für deine Aufmerksamkeit und Grüße aus Darmstadt!
Dirk
dirk.olten [ So, 05 August 2007 12:12 ] [ ID #1787458 ]

Re: Array-Werte rekursiv ändern

Hallo,

On 2007-08-05 12:12:56 +0200, "dirk.olten [at] googlemail.com"
<dirk.olten [at] googlemail.com> said:

> Mit welcher Methode / PHP-Funktion könnte dies gemacht werden?

Eine generelle Frage: Warum organisierst Du das nicht als Baum und
traversierst den Unterbaum entsprechend bei Änderung?

Gruß

Phil
Philipp Kraus [ So, 05 August 2007 14:41 ] [ ID #1787461 ]

Re: Array-Werte rekursiv ändern

> Eine generelle Frage: Warum organisierst Du das nicht als Baum und
> traversierst den Unterbaum entsprechend bei =C4nderung?
Weil ich nicht weis, wovon du sprichst?
Wie würde das als "Baum" aussehen und wie soll der dann "traversiert"
werden?
Schließlich sind die Daten so, wie ich sie ins Array hineinlese, in
dieser Form in der Datenbank zugänglich.
dirk.olten [ So, 05 August 2007 17:08 ] [ ID #1787462 ]

Re: Array-Werte rekursiv ändern

Kann mir denn keiner meine Frage beantworten?
dirk.olten [ Mo, 06 August 2007 09:47 ] [ ID #1788163 ]

Re: Array-Werte rekursiv ändern

dirk.olten [at] googlemail.com wrote:

> Ich habe ein Array, zur Strukturierung und Steuerung von
> Zugriffsrechten erzeugt.

Vorweg. Das was Du da tust erschließt sich mir in seiner Logik nicht.
(Alles ziemlich seltsam) Daher kann ich nur raten was Du da versuchst.
Wird den Anderen hier auch nicht anders gehen sonst haettest schon
längst ne Antwort.

Tip: Zugriffsrechte lassen sich auf vielerlei Arten verwalten. Schau Dir
doch fürs Erste mal an wie andere diese Problematik lösen und orientiere
Dich daran.

Hier gibts zahlreiche fertige Lösungen:
http://www.phpclasses.org/browse/class/21.html

MfG, Ulf
Ulf Kadner [ Mo, 06 August 2007 11:22 ] [ ID #1788165 ]

Re: Array-Werte rekursiv ändern

Ulf Kadner schrieb:
> dirk.olten [at] googlemail.com wrote:
>
>> Ich habe ein Array, zur Strukturierung und Steuerung von
>> Zugriffsrechten erzeugt.
>
> Vorweg. Das was Du da tust erschließt sich mir in seiner Logik nicht.
> (Alles ziemlich seltsam) Daher kann ich nur raten was Du da versuchst.
> Wird den Anderen hier auch nicht anders gehen sonst haettest schon
> längst ne Antwort.
>
> Tip: Zugriffsrechte lassen sich auf vielerlei Arten verwalten. Schau Dir
> doch fürs Erste mal an wie andere diese Problematik lösen und orientiere
> Dich daran.

Ich habe den Eindruck, dass es sich um eine Art gestaffeltes menü
handelt, die Zugriffsrechte folgen dann der Staffelung des Menüs. ich
habe sowas mal gemacht, in einem anderen Zusammenhang, mit C classic,
und zwar mit verketteten Listen. So kommt mir das auch vor.

Grüße

Werner

--
--------------------------------------------------
Dorothee & Werner Partner, 45699 Herten
http://www.sonoptikon.de
Werner Partner [ Mo, 06 August 2007 13:05 ] [ ID #1788166 ]

Re: Array-Werte rekursiv ändern

dirk.olten [at] googlemail.com schrieb:
> Hallo Newsgroup
>
> Ich habe ein Array, zur Strukturierung und Steuerung von
> Zugriffsrechten erzeugt.
>
> [section_type] bezeichnet:
> 1 = Firma
> 2 = Abteilung in der Firma
> 3 = Produkt1
> [section_level] bezeichnet die Verschactelungsebene
> [section_right] ist das Zugriffsrecht, welches für den User gewährt
> wurde.
>
> ####################################################
> Auszug aus dem Array (welches per while-Schleife aus der Datenbank
> gelesen wurde und in Wirklichkeit viel größer ist und noch tiefere
> Verschachtelungen aufweist.
>
> [structure] => Array
> (
> [0] => Array
> (
> [section_name] => Musterunternehmen
> [section_id] => 14
> [section_level] => 1
> [section_type] => 1
> [section_right] => N
> )
>
> [1] => Array
> (
> [section_name] => Musterabteilung
> [section_id] => 101
> [section_level] => 2
> [section_type] => 2
> [section_right] => N
> )
>
> [2] => Array
> (
> [section_name] => Musterprodukt
> [section_id] => 545
> [section_level] => 3
> [section_type] => 3
> [section_right] => Y
> )
> }
> #######################################################
> Was ich schon hinbekommen habe, ist dass wenn bei einem Element mit
> einem niedrigen section_level das section_right auf 'Y' gesetzt ist,
> dass die darin liegenden Unterelemente ebenfalls dieses Recht ererben.
>
> Im obigen Bespiel handelt es sich aber um einen Sonderfall.
> Hier ist nämlich bei key [2] ein Produkt freigegeben, welches sich in
> einer nicht freigegebenen Abteilung [1] und einer nicht freigegebenen
> Firma [0] befindet.
> Damit das Produkt angezeigt werden kann, müssen nun die darüber
> liegenden Eltern-Elemente ebenfalls freigegeben werden.
> Da bei dem Aufbau des Arrays in der Schleife, beim Schreiben des key
> [3] die nicht-freigegebenen Elemente [0] + [1] bereits geschrieben
> sind, kann ich (so denke ich) erst am Ende der Schleife das Array
> nochmal durchgehen und deren section_right-Flags auf Y ändern.
Wie Ulf schon erwähnte, der Grund warum wohl niemand anwortet ist der,
dass niemand so recht versteht was du hier für Verrenkungen machst.


>
> Mit welcher Methode / PHP-Funktion könnte dies gemacht werden?

Du musst ein Array nicht mit Schleifen durchlaufen sondern kannst jedes
Element auch so Adressieren:

array[key] = value

array[key][key]=value ....

Ich glaub e aber eher, dass du eher nach dem Konzept fragen solltest wie
du dein Problem elegant lösen kannst. Dazu müsste man aber erstmal
wissen, was du erreichen möchtest.

Ich z.B. verstehe gar nicht, warum du hier überhaupt eine Array aus der
DB aufbaust. Wenn die DB logisch richtig aufgebaut ist, dann sollte es
reichen eine Abfrage zu starten, die dir am Schluss das Ergebnis liefert
ob jemand berechtigt ist oder nicht.

>
> Danke für deine Aufmerksamkeit und Grüße aus Darmstadt!
> Dirk
>
Stefan Braumeister [ Mo, 06 August 2007 13:42 ] [ ID #1788167 ]

Re: Array-Werte rekursiv ändern

Hi Ulf, hi Stefan
[ulf]> Vorweg. Das was Du da tust erschließt sich mir in seiner Logik
nicht.
[ulf]> (Alles ziemlich seltsam) Daher kann ich nur raten was Du da
versuchst.
[ulf]> Wird den Anderen hier auch nicht anders gehen sonst haettest
schon
[ulf]> längst ne Antwort.

macht nichts.

[ulf]> Tip: Zugriffsrechte lassen sich auf vielerlei Arten verwalten.
Schau Dir
[ulf]> doch fürs Erste mal an wie andere diese Problematik lösen und
orientiere
[ulf]> Dich daran.

Es geht nicht um Zugriffsrechte, sondern darum, ein Array zu
überarbeiten.

[ulf]> Hier gibts zahlreiche fertige Lösungen:http://
www.phpclasses.org/browse/class/21.html

Klar kenne ich PHP-Classes. Da wurde ich schon des =D6fteren fündig.
Aber hier handelt es sich um ein bestehendes Projekt, welches ich
übernommen habe. Das Budget erlaubt nicht, alles komplett
umzustrukturieren.

[stefan]> Ich z.B. verstehe gar nicht, warum du hier überhaupt eine
Array aus der
[stefan]> DB aufbaust. Wenn die DB logisch richtig aufgebaut ist, dann
sollte es
[stefan]> reichen eine Abfrage zu starten, die dir am Schluss das
Ergebnis liefert
[stefan]> ob jemand berechtigt ist oder nicht.

Das ist ja das Problem. Das liefert die DB nun mal nicht und ich habe
nicht die Zeit, alles neu zu machen. Was mir bleibt ist: ein Array zu
verwenden, welches in der Session abgelegt wird und die spezifischen
Eigenschaften hat.

Wie auch immer...
Ich habe mir selbst geholfen, indem Ich mit array_reverse($struktur)
das ganze auf den Kopf gestellt habe, womit die Kind-Elemente oben
stehen, dann in einer foreach()-Schleife das Array durchgeparst,
anschließend wieder array_reverse() -> Fertig.

Das ist sicherlich quick & dirty und mag euch vielleicht unorthodox
erscheinen, aber es funktioniert!

Thema =3D erledigt!

Vielen Dank für die Antworten
Gruß
Dirk
dirk.olten [ Mo, 06 August 2007 14:27 ] [ ID #1788170 ]

Re: Array-Werte rekursiv ändern

dirk.olten [at] googlemail.com wrote:
> Hi Ulf, hi Stefan
> [ulf]> ...

Wenn Du mir etwas zu sagen hast dann mache das bitte in ner seperaten
Antwort. Ich hab schließlich auch meine Antwort an Dich verfaßt und
nicht an beliebige Andere.

Nutze doch einfach wie allen anderen hier einen Newsreader (z.B.
Thunderbird) und wirf nicht mit solch seltsammen und unübersichtichen
Quotings um dich.

Danke!

MfG, Ulf
Ulf Kadner [ Mo, 06 August 2007 17:33 ] [ ID #1788172 ]
PHP » de.comp.lang.php.misc » Array-Werte rekursiv ändern

Vorheriges Thema: Nicht belegte Smarty-Variablen finden?
Nächstes Thema: 3d Diagrammkurve mittels (imageline"?