Mehrdimensionales Array mit foreach() auslesen!?

Mik3e

Erfahrenes Mitglied
Hi zusammen,

Stehe im Moment ein wenig auf der Leitung.
Ich habe ein Formular, in dem in einem mehrdimensionalen Array Textdaten eingegeben werden. Dies sieht folgendermaßen aus:
HTML:
<input type="text" name="possibleValues[1][1]" value="Wert 1 in Deutsch" />
<input type="text" name="possibleValues[1][2]" value="Wert 1 in Englisch" />
<input type="text" name="possibleValues[2][1]" value="Wert 2 in Deutsch" />
<input type="text" name="possibleValues[2][2]" value="Wert 2 in Englisch" />
Die erste Dimension des Feld-Array bildet den Primärschlüssel des Datensatzes ab (diese Daten werden für ein Update aus der Datenbank ausgelesen), die zweite Dimension ist der zugehörige Foreign-Key der Sprache (1= Deutsch, 2= Englisch).

Nach dem Submit muss ich den Array wieder serialisieren und anhand der Keys in die Datenbank eintragen.

Nun tritt folgendes Problem beim Auslesen des Arrays (nach dem submit) auf:
PHP:
print_r($possibleValues);
// liefert korrekterweise:
// Array ( [1] => Array ( [1] => Wert 1 Deutsch [2] => Wert 1 Englisch ) [2] => Array ( [1] => Wert 2 Deutsch [2] => Wert 2 Englisch

// Mit dieser Test-schleife möchte ich nun die Daten serialisieren und dann in die Tabelle eintragen:
foreach ($possibleValues as $itemKey) {
    foreach ($possibleValues[$itemKey] as $languageKey => $value) {
        echo $value;
    }
}

Interessanterweise erhalte ich nun diese Fehlermeldung:
Illegal offset type
Und zwar beim beginn der innen liegeneden foreach() Schleife..! Anscheinend passt ihm $possibleValues[$itemKey] nicht...!?

Ich kann mir aber leider nicht erklären, was an diesem Array nicht passen soll... (oder ich bin überarbeitet und übersehe etwas)..

Bitte um Hilfestellung,
Danke & Ciao,
Mike
 
Probier mal Folgendes:
PHP:
<?php

	foreach( $possibleValues as $itemKey ) {
		if( !is_array($itemKey) ) {
			echo $itemKey;
			continue;
		}
		foreach( $itemKey as $languageKey => $value ) {
			echo $value;
		}
	}

?>
 
Das ist mir jetzt schleierhaft...
Gebe ich nur den Index in der zweiten foreach() an (so wie in deinem Beispiel), dann funktionierts.. Gebe ich den Feldbezeichner UND den Index ein, checkt ers nicht... ($possibleValues[$itemKey])... Ich verwende foreach() schon seit Ewigkeiten und habe bisher immer mit der kompletten Angabe gearbeitet... kapier ich nicht..

So klappts jetzt jedenfalls:
PHP:
foreach( $possibleValues as $itemKey ) { 
    foreach($itemKey as $languageKey => $value ) { 
        echo "LANGUAGE-KEY: ".$languageKey.', WERT: '.$value.'<br>'; 
    } 
}

Noch ein Problem:
Ich muss nun noch irgendwie den Index erster Ebene (also den eigentlichen Primärschlüssel) des felds bekommen... Hast Du eine Idee (mit echo $itemKey gehts natürlich nicht, da es ein Array ist)...
Ich vermute um eine Array-Funktion komme ich da nicht rum...!?

Danke & Ciao,
Mike
 
Hat niemand eine Idee, wie man auf den Index der ersten Ebene des Arrays kommen kann? Brauche hier wirklich dringend Hilfe ... (probiere schon den halben Nachmittag rum und komme einfach nicht auf eine gute Lösung)..

Danke & Ciao,
Mike
 
Du hast doch die Lösung schon in der inneren Schleife:
PHP:
 foreach( $possibleValues as  $itemKey => $item ) { 
    echo "ITEM-KEY: ".$itemKey;
    foreach($item as $languageKey => $value ) { 
        echo "LANGUAGE-KEY: ".$languageKey.', WERT: '.$value.'<br>'; 
    } 
}
Gruß hpvw
 
Hi,

Nein, das ist leider nicht die Lösung @HP....
Wenn ich den Index der ersten Ebene ausgeben möchte, erhalte ich wieder die Fehlermeldung "Illegal offset type".... Warum ist mir unklar, da ich foreach eigentlich ständig verwende...

Möglicherweise hat er ein Problem damit, dass der Array-Index nicht von 0-n sonder von n-m läuft... Obwohl das bei foreach egal sein sollte...!`

Ich bin leicht verwirrt...

Ciao,
Mike
 
Nochmals zum Verständnis (vielleicht war das Beispiel auch nicht optimal).

Das Array-Feld könnte so aussehen
HTML:
<input name="arrayElement[4][1]" value="wert 1">
<input name="arrayElement[4][2]" value="wert 2">
<input name="arrayElement[5][1]" value="wert 3">
<input name="arrayElement[8][4]" value="wert 1">

Nach POST und $_REQUEST ist der Wert nun in $arrayElement gespeichert:
PHP:
$arrayElement=$_REQUEST['arrayElement'];

Wie ihr sehen könnt, ist die Indexierung nicht durchlaufen (von 0-n) sondern "wild" gemischt. Dies deshalb, da der 1. Index und der 2. Index jeweils Primärschlüssel einer Tabelle sind und gemeinsam so einen eindeutigen Schlüssel ergeben.

Nachdem es sich hierbei um eine UPDATE Funktion handelt, muss ich diese Primärschlüssel irgendwie mitführen.

--------
"Billige"-Lösung (Workaround):
Ich mache einen Array und führe die Primärschlüssel in einem versteckten Feld mit (hässlich).
-------

Nun würde ich diesen Array gerne mit foreach() durchlaufen und sowohl die Werte als auch die entsprechenden Indizes auslesen. Aber genau hier liegt das Problem... Ich kann den Index erster Ebene nicht auslesen (da es ja wiederum ein Array ist)... :confused:

Maybe das Ganze ist jetzt etwas leichter verständlich ;o)

Ciao,
Mike
 
Bei mir funktioniert Folgendes einwandfrei:
PHP:
<? echo '<form method="get" action="'.$_SERVER['PHP_SELF'].'">'?>
<input type="text" name="possibleValues[1][1]" value="Wert 1 in Deutsch" />
<input type="text" name="possibleValues[1][2]" value="Wert 1 in Englisch" />
<input type="text" name="possibleValues[2][1]" value="Wert 2 in Deutsch" />
<input type="text" name="possibleValues[2][2]" value="Wert 2 in Englisch" />
<input type="submit" name="go">
</form>
<?
    $a = array( 1 => array(
                    1 => "Text 1 1",
                    2 => "Text 1 2"),
                2 => array(
                    1 => "Text 2 1",
                    2 => "Text 2 2"));
                    

$possibleValues = isset($_GET['go'])?$_GET['possibleValues']:$a;
foreach( $possibleValues as  $itemKey => $item ) {
    echo "ITEM-KEY: ".$itemKey."<br>\n";
    foreach($item as $languageKey => $value ) {
        echo "&nbsp;&nbsp;LANGUAGE-KEY: ".$languageKey.', WERT: '.$value."<br>\n";
    }
}
?>
Gruß hpvw

EDIT: Das ganze unter läuft bei mir unter Windows mit PHP 5.0.3
 
Zurück