Array Werte in Schleife abfragen und neu befüllen.

Joe

Erfahrenes Mitglied
Hallo Tutorianer,
mit Arrays steh ich immernoch leicht auf Kriegsfuss und bräuchte mal etwas Hilfe.

Problem1:
Zuerst möchte ich ein Array mit den Daten:
[1]foo,
[2]bar,
[3]Behälter 2l=>Inhalt 1l,
[4]Behälter 2l=>Inhalt 0,5l,
[5]Behälter 5l=>Inhalt 0l,
[6]foo2
Befüllen.
Das ganze wird dann serializiert und in die DB geschrieben.
Geht das wie ich mir das denke?


Problem2:
Selbes Array wird aus DB gelesen und mit Unserialize() verfügbar gemacht.
Ich möchte nun das Array in einer(wahrscheinlich mehrere?) Schleife durchgehen und

1. Auf Behälter 2l oder Behälter 5l prüfen, ob diese vorhanden sind. Wenn ja
2. Eine fiktive Menge zb 100l Wasser auf alle Behälter verteilen bis alle Behälter gefüllt sind(Rest ist Abfall).
Wie könnte so eine Schleife aussehen?

Gerade Problem 2.2 bereitet mir die meisten Probleme da ich nicht weiss mit welchen Befehlen ich in einer Schleife den Wert(in meinem Fall Inhalt) eines vermutlich mehrdimensionalen Arrays holen kann.



Bin für jede Hilfe dankbar (muss ja nichtt gleich ein kompletter Code sein).
Grüsse Joe.
 
Kommt auf die Schliefe drauf an.
PHP:
foreach($myArray as $item){
    var_dump($item);  //Wenn es ein Unterarray ist, so ist $item hier als Array verfügbar
    var_dump($item['unterschlüssel']);
}
//oder
for($i=0; $i<count($myArray); $i++){
    var_dump($myArray[$i]);   //Wenn es ein Unterarray ist, so ist $item hier als Array verfügbar
    var_dump($myArray[$i]['unterschlüssel']);
}
 
  • Gefällt mir
Reaktionen: Joe
Ich glaube ich verstehe.
Also gehe ich das Array einzeln durch und wenn das vardump == gesuchtes Ergebniss ist hole ich den Unterschlüssel und befülle ihn.

OK jetzt habe ich eine gute Vorstellung wie das machbar ist.
Werde das mal versuchen umzusetzen falls es mir nicht gelingt frage ich nochmal nach.
Danke yaslaw.
 
var_dump == debuggen :D eigentlich klar.. manchmal spielt mein Kopf würfeln.

Ich bekomme nix in die DB geschrieben mit serialize.
PHP:
			$array[0][0] = $Wasserfund;
			$array[0][1] = $Menge;
			$ItemsSerialize = serialize ($array);
			echo serialize($array);
			$sql  =("UPDATE
							Gepaeck
						SET
							Items=$ItemsSerialize					
						Where
							Username=$Username");
			mysql_query($sql);				
			echo $sql;

Das echo $sql; und echo serialize($array); Sagen dies:
Code:
a:1:{i:0;a:2:{i:0;s:8:"Kanister";i:1;i:20;}}

UPDATE Gepaeck SET Items=a:1:{i:0;a:2:{i:0;s:8:"Kanister";i:1;i:20;}} Where Username=MeinerEiner

Die DB bleibt im betreffenden Feld leer.
Noch ne Frage wie kann ich den ersten Key des Arrays von PHP festlegen lassen? Weil es ist möglich das dieser Key bereits Daten beinhaltet welche ich behalten möchte.
 
Ich sehe das erste Mal, dass man einer MySQL-Query ein serialisiertes Array übergibt und MySQL es selbst auseinanderpflücken soll.. Mag sein, dass ich es einfach nicht kenne, 's mag aber auch sein (und das denke ich, wenn ich das sehe), dass es so nicht geht.

serialize() ist lediglich ein Hilfscontainer, um einen Datenbestand (zB Array) in ein String zu verpacken.

mfg chmee
 
Hi Chmee,
Danke für den Einwand, hätte ja auch berechtigt sein können. Es ist aber wirklich so das man ein Array in ein DB-Feld nur mit Serialize() geschrieben bekommt. Zumindest sollte es so. Mit Unserialize() bekommt man dann wieder das Array aus der Datenbank. Ich wüsste sonst nicht wie man ein Array andersweitig in DB bekommen könnte. In dem Fall blibe mir nur übrig schlicht ne neue Tabelle für meine Wasserbehälter anzulegen was wahrscheinlich unperformanter wäre.

http://www.selfphp.de/funktionsreferenz/variablen_funktionen/serialize.php

Warum das nun so nicht funktioniert kann eigentlich nur 2 Gründe haben entweder falsche Befehlsyntax oder es geht tatsächlich nicht und ich habs falsch verstanden.
 
@chmee
Es geht. Habs grad getestet
PHP:
<?php 
include_once('connect.php');

$array = array('NULL', 'EINS','ab' => array('A', 'B'));
var_dump($array);

$ser = serialize($array);
var_dump($ser);

$sql = "INSERT INTO test (test) VALUES ('{$ser}')";
mysql_query($sql);
$id = mysql_insert_id();

$sql = "SELECT test FROM test WHERE id = {$id}";
$result = mysql_query($sql);

$ser = mysql_result($result, 0, 'test');
var_dump($ser);

$array = unserialize($ser);

var_dump($array);
?>

Der Fehler sieht man aber im ausgegeben SQL von Joe
SQL:
UPDATE Gepaeck SET Items=a:1:{i:0;a:2:{i:0;s:8:"Kanister";i:1;i:20;}} Where Username=MeinerEiner
Hier fehlen im SET sowei im WHERE die ' um die Strings
SQL:
UPDATE Gepaeck 
SET Items='a:1:{i:0;a:2:{i:0;s:8:"Kanister";i:1;i:20;}}' 
Where Username='MeinerEiner';
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Joe
Hmm. Na gut, dass ein serialized Array (welcher Form auch immer) in ein VarChar/Text gespeichert werden kann, ist mir schon klar. (Da ist das Problem eh das Kleinere, da sollte im Zwifelsfall ein mysql_real_escape_string() rübergeschickt werden). Aber es wird nicht automatisch auf die Tabellenspalten aufgeteilt, also zB

Code:
a:2:{Anzahl:1;Ort:"Berlin"}

zu

Code:
Anzahl * Ort
  1    * Berlin
mfg chmee
 
Ok habs nun hinbekommen. Wird also erfolgreich serialisiert und deserialisiert.
Verwundert hat mich allerdings ein Offset-Error der daran lag das Mein DB-Feld auf VChar(15) stand, was natürlich bei weitem nicht reicht.

Also sieht meine Schleife (noch etwas unfertig aber funktionell) nun so aus:
PHP:
		if (count($ItemsUnSerialize) > 0) {
			while ($Menge !=0){
				for($i=0; $i<count($ItemsUnSerialize); $i++){
					//var_dump($ItemsUnSerialize);
					// befüllen
					if ($ItemsUnSerialize[$i]) {
						if ($ItemsUnSerialize[$i][0] == 'Kanister') {
							var_dump($ItemsUnSerialize);
							$Inhalt = $ItemsUnSerialize[$i][1];
							echo "<p>Kanister</p>";
							echo "<p>$Inhalt</p>";
							// Berechnungen für neuen Inhalt
							$Menge =0;
						}
						$Menge =0;
					}
					echo "<p>Test</p>";
					$Menge =0;
				}
			}
		}

Eins bereitet mir allerdings noch Kopfzerbrechen. Mein Array wird (s.u.) immer überschrieben wenn etwas neues hinzukommt.
PHP:
			$array[0][0] = $Wasserfund;
			$array[0][1] = $Menge;
			$ItemsSerialize = serialize ($array);
Wie kann ich festlegen das mein Befüllen bei Key0 beginnt und den nächsten freien Key befüllt? Ums klar auszudrücken dieses Array beinhaltet alle Items die in ein Gepäck passen. Und da passiert es eben das auch mal Keys wieder gelöscht werden.

@Chmee weil es eben eine unübersichtlich lange Tabelle bei X möglichen Items werden würde musste das ganze über ein Array in einem DB-Feld passieren.
 
Zurück