Frage zum aufbau eines arrays für suche/vergleich

spikaner

Quereinsteiger @ php
Morgen zusammen, ich brauche mal wieder eure Hilfe.
Ich habe ein xml Dokument das ich "zerlegen" will vergleichen/berechnen und danach in die Datenbank schmeißen, das xml zerlegen usw is kein Problem, nur wie am "dümmsten" in ein array stecken damit das ganze nicht zu kompliziert wird, einfaches Beispiel
Ich habe
einmal
logTime="2011-07-09 06:30:22" itemID="1002" actorID="2890187" action="Lock" typeID="27405" quantity="386"
und einmal
logTime="2011-07-09 06:30:16" itemID="1002" actorID="2890187" action="Unlock" typeID="27405" quantity="286"
so das Script schauen ob
1. actorID, itemID und typeID gleich sind
2. logTime bei action="Lock" höher als logTime bei action="Unlock"
um schlieslich zu errechnen ob der actor bei quantity etwas hineingetan oder entfernt hat und wenn ja wieviel.
Sprich wie sollte ich das array am besten aufbauen um es nach diesen kriterien am einfachsten durchsuchen/berechnen kann.
Mein momentaner Ansatz schaut so aus aber damit komm ich nicht weiter.
PHP:
function xml_attribute($object, $attribute)
{
    if(isset($object[$attribute]))
        return (string) $object[$attribute];
}
function datetime($date)
{
	$a = explode(" ",$date);
	$d = explode("-",$a[0]);
	$t = explode(":",$a[1]);
	return $date = mktime($t[0],$t[1],$t[2],$d[1],$d[2],$d[0]);
}
$file="http://localhost/testfile.xml";
$inhalt=file_get_contents($file);
if (!empty($inhalt)) {
	$xml = new SimpleXMLElement($inhalt);
	$gegenstaende = $xml->result->rowset;
	}
	else
	{
	echo "error";
	die;
}
$zeilen = count ($gegenstaende->row);
for ($i = 0; $i < $zeilen; $i++){
	$zeile = $gegenstaende->row->$i;
	$time[$i] = xml_attribute($zeile, 'logTime');
	$name[$i] = xml_attribute($zeile, 'actorName');
	$aktion[$i] = xml_attribute($zeile, 'action');
	$type[$i] = xml_attribute($zeile, 'typeID');
	$menge[$i] = xml_attribute($zeile, 'quantity');
	$containerID[$i] = xml_attribute($zeile, ' itemID');
	$time[$i] = datetime($time[$i]);
}
mfg Spikaner
 
Hallo, ich weiß nicht, obs dich weiter bringt, aber das hier könnte es erledigen:

PHP:
<?php
function xml2array($fname){
  $sxi = new SimpleXmlIterator($fname, null, true);
  return sxiToArray($sxi);
}

function sxiToArray($sxi){
  $a = array();
  for( $sxi->rewind(); $sxi->valid(); $sxi->next() ) {
    if(!array_key_exists($sxi->key(), $a)){
      $a[$sxi->key()] = array();
    }
    if($sxi->hasChildren()){
      $a[$sxi->key()][] = sxiToArray($sxi->current());
    }
    else{
      $a[$sxi->key()][] = strval($sxi->current());
    }
  }
  return $a;
}

// Read cats.xml and print the results:
$catArray = xml2array('cats.xml');
print_r($catArray);
?>
 
Ich bin jetzt soweit das mein mehrdimensionales array so aussieht
Code:
Array
(
    [0] => Array
        (
            [time] => 1310225892
            [name] => James
            [aktion] => Unlock
            [type] => 3532
            [menge] => 1
            [containerID] => 1002176916047
        )

    [1] => Array
        (
            [time] => 1310225889
            [name] => James
            [aktion] => Unlock
            [type] => 17478
            [menge] => 1
            [containerID] => 1002176916047
        )

    [2] => Array
        (
            [time] => 1310208902
            [name] => Lin
            [aktion] => Unlock
            [type] => 651
            [menge] => 1
            [containerID] => 1002176916047
        )
Sollte ich ab dieser stelle lieber eine Datenbank benutzen und gleich alle werte dort eintragen lassen, und lieber diese dann sortieren/auswerten lassen, ala
SELECT * from blup where Name = James and TYPE = 651, da stellt sich aber dann wieder die Frage wie komme ich an die verschiedenen Types ran, Fragen über Fragen :(

Ich steh momentan komplet auf den schlauch und rätzel schon die ganze Nacht herum wie man das am besten/überhaupt lösen kann
 
Naja, einige Werte kann man sich selbst her leiten, "time" zb. ist ein Unix-Zeitstempel, dafür sollt man den Typ TIMESTAMP verwenden (wenn man MySQL benutzt).

"name" ist ein CHAR oder VARCHAR.
"aktion" ist ein CHAR oder VARCHAR.
"type" ist ein INT
"menge" ist ein INT
"containerID" ist ein INT

Dazu noch eine Spalte "id" mit dem Typ INT, NOT NULL, AUTO_INCREMENT, PRIMARY KEY.

Das sollte so eine Tabelle geben

SQL:
CREATE TABLE `test`.`spikaner_table` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`time` TIMESTAMP NOT NULL ,
`name` VARCHAR( 20 ) NOT NULL ,
`aktion` VARCHAR( 20 ) NOT NULL ,
`type` INT NOT NULL ,
`menge` INT NOT NULL ,
`containerID` INT NOT NULL
);

Ich gehe mal davon aus, das du weißt, wie mit MySQL umgegangen werden muss.
 
Zurück