Dynamisches Array
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
break
code
dynamisch halten
formular
haufe
iteration
jemand
kopie
liegenden array
normalen listen
objekt
parameter
position
referenz
sprache
switch
verwenden
-
Hi
Ich habe ein mehrdimensionales Array, Beispielsweise so:
$groups = array( "p1" => array( "pp1" => 0, "pp2" => array( 0, 0, 0 ), "pp3" => array( 0, 0, 0 ) ) );
Nur viel größer und mit allen möglichen Namen also nicht immer nur p1 pp1 sondern auch ab3 cg9 oder sowas.
Und in einem Formular habe ich einen Haufen Checkboxen, die alle dem Array 'comp_param' zugewiesen sind.
<input type="Checkbox" name="comp_param[]" value="p1.pp2.1" class="window_work_group_field_check" />
Ich splitte den valuewert nach dem '.' und habe so die Position im Array $group und kann den Wert dort von 1 auf 0 ändern.
Meine Lösung sieht so aus:
$caa_post = $_POST['comp_param']; if(count($caa_post)>0){ foreach($caa_post AS $caa_value){ echo "[$caa_value]<br/>"; $caa_array = split("\.", $caa_value); echo "cnt: ".count($caa_array)."<br/>"; echo "0: ".$caa_array[0]."<br/>"; echo "1: ".$caa_array[1]."<br/>"; echo "2: ".$caa_array[2]."<br/>"; switch(count($caa_array)){ case 1: $competency_actions_active[$caa_array[0]] = 1; break; case 2: $competency_actions_active[$caa_array[0]][$caa_array[1]] = 1; break; case 3: $competency_actions_active[$caa_array[0]][$caa_array[1]][$caa_array[2]] = 1; break; } #echo "[/$caa_value]<br/>"; echo "<br/>"; } }
Allerdings gibt es hier nur die Möglichkeit für 1,2 und 3 Parameter. Ich möchte das aber dynamisch halten. Hat jemand eine Möglichkeit wie ich statt dem switch-case dynamisch an den Wert gelange?
MFG
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Dafür brauchst du eine Iteration bzw. eine Rekursion.
Ich machs mal iterativ für dich:
$sub = $competency_actions_active; for( $depth = 0; $depth < count( $caa_array ); $depth++ ) { // wählt den weiter unten liegenden array aus // bei $depth == count( $caa_array ) - 1 natürlich dann den integer $sub = $sub[ $caa_array[ $depth ] ]; } $sub = 1;
€dit: Oh habe grade gesehn, dass es doch n bissl anders ist. Habs falsch verstanden, aber korrigiert.
Beitrag zuletzt geändert: 18.4.2011 17:46:51 von reimann -
Vielen DAnk, aber es klappt nicht so ganz.
Den Ansatz vesrtehe ich und es sollte auch gehen, er läuft die schleife auch richtig durch nur leider schreibt er den Wert in sub nicht.
Ich würde gerne vor dem $sub = 1 die Instanz auf die $sub zeigt, also den Array zweig ausgeben lassen. So in etwa: $goup['p1']['pp2'][1].
also dass ich weiss wo er gerade drauf zeigt.
Geht das? MFG -
Naja du kansnt es mal mit dem hier probieren (das verwendet extra eine Referenz für den Fall, dass es ansonsten kopiert wird):
$sub = $sub[ $caa_array[ $depth ] ];
Ich kann das auch so umbaun, dass es anzeigt, wo es sein müsste, aber wo es tatsächlich ist, ist aus dem Prinzip schon nicht möglich, denn woher soll die Variable wissen, dass sie aus einem Array stammt?
$sub = $competency_actions_active; $current = "$bla"; for( $depth = 0; $depth < count( $caa_array ); $depth++ ) { // wählt den weiter unten liegenden array aus // bei $depth == count( $caa_array ) - 1 natürlich dann den integer $current .= "['" . $caa_array[ $depth ] . "']"; $sub = &$sub[ $caa_array[ $depth ] ]; } $sub = 1;
Beitrag zuletzt geändert: 18.4.2011 19:35:00 von reimann -
Genau das habe ich gesucht bin nur nicht drauf gekommen. Also er geht eindeutig die richtigen Felder durch. Nur kann er nicht reinschreiben. Das heisst wenn ind $sub 0 steht und danach sage ich ja $sub = 1 dann steht am Ende immernoch $sub = 0 drinn.
Kann es daran liegen dass es in einer foreach schleife liegt? weil in foreach schleifen kann man Werte nur auslesen, nicht verändern.
MFG
Edit
Nein, so kann das garnicht gehen. Es kann so nur zum Auslesen funktionieren, weil $sub ja nur eine Instanz auf mein Array ist und wenn ich $sub änder ich somit nicht mein array änder.
Beitrag zuletzt geändert: 18.4.2011 20:45:58 von programtools -
Nein, es stimmt zwar, dass bei foreach eine Kopie gemacht wird, aber das kann man auch durch das nutzen einer Referenz verhindern und abgesehn davon wird die Variable, die im foreach steht nicht verändert, sondern ein andere.
foreach($array as &$element)
So also es war noch eine Referenz zu wenig.
$sub = $competency_actions_active;
Das Gesamtwerk plus Debugausgaben wäre dann das:
var_dump( $competency_actions_active ); echo "<br />"; if(count($caa_post)>0){ foreach($caa_post AS $caa_value){ echo "[$caa_value]<br/>"; $current = ""; $caa_array = split("\\.", $caa_value); echo "0: ".$caa_array[0]."<br/>"; $sub = &$competency_actions_active; for( $depth = 0; $depth < count( $caa_array ); $depth++ ) { echo "depth: ".$depth."<br/>"; // wählt den weiter unten liegenden array aus // bei $depth == count( $caa_array ) - 1 natürlich dann den integer $sub = &$sub[ $caa_array[ $depth ] ]; $current .= "['" . $caa_array[ $depth ] . "']"; echo "current: ".$current."<br/>"; echo "current_value: ".$sub."<br/>"; } var_dump( $sub ); $sub = 1; var_dump( $sub ); echo "<br/>"; } } var_dump( $competency_actions_active );
Arrays werden ohne & anscheinend immer als Kopie übergeben, was ich ziemlich eigenartig finde, da in anderen Sprachen Arrays wie Objekte behandelt werden, aber in PHP sind sowieso keine normalen Listen da.
Beitrag zuletzt geändert: 18.4.2011 21:23:06 von reimann -
Ja, jetzt klappts :D
super und vielen Dank.
Was genau hat das & jetzt gemacht ?
MFG -
Das & erzeugt eine Referenz, dass heißt $a = $b kopiert den Wert von b in a (außer bei Objekten soweit ich weiß). Das heißt nach $a = $c gilt nichtmehr $a == $b, aber bei $a = &$b gilt nach $a = $c immer noch $a == $b, da $a nur ein anderer Name für $b ist und nicht ein anderer Speicherbereich. Das nennt sich Referenz. Allerdings musst du jetzt nicht immer & verwenden, da der iInterpreter von php das oftmals automatisch übernimmt.
-
Vielen Dank, weil ich merke gerade wie nützlich das doch ist und dass ich es tatsächlich schon einige Male gut hätte gebrauchen können.
Somit läuft alles tadellos. MFG -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage