# Mehrdimensionales Array mit foreach() auslesen!?



## Mik3e (23. Dezember 2005)

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:

```
<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:*

```
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


----------



## Gumbo (23. Dezember 2005)

Probier mal Folgendes:
	
	
	



```
<?php

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

?>
```


----------



## Mik3e (23. Dezember 2005)

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:

```
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


----------



## Mik3e (23. Dezember 2005)

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


----------



## hpvw (23. Dezember 2005)

Du hast doch die Lösung schon in der inneren Schleife:
	
	
	



```
foreach( $possibleValues as  $itemKey => $item ) { 
    echo "ITEM-KEY: ".$itemKey;
    foreach($item as $languageKey => $value ) { 
        echo "LANGUAGE-KEY: ".$languageKey.', WERT: '.$value.'<br>'; 
    } 
}
```
Gruß hpvw


----------



## Gumbo (23. Dezember 2005)

Vielleicht solltest du noch einmal die Syntax der foreach-Kontrollstruktur studieren, Mike.


----------



## Mik3e (26. Dezember 2005)

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


----------



## Mik3e (26. Dezember 2005)

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

Das Array-Feld könnte so aussehen

```
<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:

```
$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)...   

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

Ciao,
Mike


----------



## Gumbo (26. Dezember 2005)

Und du bist dir der Syntax der foreach-Kotrollstruktur wirklich bewusst?


----------



## hpvw (26. Dezember 2005)

Bei mir funktioniert Folgendes einwandfrei:
	
	
	



```
<? 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


----------



## Mik3e (27. Dezember 2005)

Hi,

Um nicht wirklich dämlich zu wirken, habe ich mal Deinen Quellcode 1:1 kopiert..
Und erhalte wieder die selbe Fehlermeldung... !?
Ich verwende allerdings PHP 5.0.1 (wenn mich nicht alles täuscht, server läuft gerade nicht, kann daher nicht nachsehen)...

Ich kapiers einfach nicht... Möglicherweise noch ein Bug!? (obwohl foreach gibts ja schon seit PHP 4.0...)...

Hm.. werd mal die PHP Version upgraden..

Ciao,
Mike


----------

