mehrdimensionales Array fehlende Keys und Werte hinzufügen

Joe

Erfahrenes Mitglied
Hallo,
Ich möchte gerne ein mehrdimensionales Array durchsuchen ob ein bestimmter Key und dessen Wert vorhanden ist um ihn dann, falls nicht vorhanden, einzufügen.

Habe das wi folgt versucht:
PHP:
$count=count($data1);
for ($i=$NearestKoordsX1; $i<$NearestKoordsX2; $i++) {
	for ($j=$NearestKoordsY1; $j<$NearestKoordsY2; $j++) {
		if (!(in_array($i,$data1)) AND !(in_array($j,$data1))) {
			$count++;
			$data1[$count]['PosX'] = $i;
			$data1[$count]['PosY'] = $j;
		}
	}
}
Das fügt mir dann aber doppelte Werte ein und ist so nicht gedacht.
Das Array ist etwa so aufgebaut (Ausschnitt von var_dump):
PHP:
[17]=> array(4) { ["Ressource"]=> string(5) "Stein" ["PosX"]=> string(3) "119" ["PosY"]=> string(3) "100" ["Menge"]=> string(4) "9791" } [18]=> array(4) { ["Ressource"]=> string(5) "Stein" ["PosX"]=> string(3) "102" ["PosY"]=> string(2) "97" ["Menge"]=> string(4) "9991" } [19]=> array(4) { ["Ressource"]=> string(5) "Stein" ["PosX"]=> string(3) "120" ["PosY"]=> string(3) "125" ["Menge"]=> string(4) "3603" }

Sinn ist es jede PosX/PosY welche noch nicht im Array sind aufzufüllen. Das dient dazu um jeder Position welche auf einer Karte nicht besetzt ist eine Position zu geben.
 
Ich würde das array eher so aufbauen, dass du als Indizes die Koordinaten benutzt:
PHP:
$system = array();
$system[119][100]["Ressource"] = "Stein"
$system[119][100]["Menge"] = 9791;
 
  • Gefällt mir
Reaktionen: Joe
Hab da mal was kleines, sicher noch verbesserbares zusammengestiefelt
PHP:
foreach($koords as $koord){
    $flag = false;
    foreach($data1 as $item){
        if($koord["PosX"]==$item["PosX"] && $koord["PosY"]==$item["PosY"]){
            $flag = true;
            break;
        }
    }
    if(!$flag){
       $newIndex = count($data1);
       $data1[$newIndex]["PosX"] = $koord["PosX"];
       $data1[$newIndex]["PosY"] = $koord["PosY"];
    }
}

Das ist die Definiton meiner Testdaten
PHP:
$data1 = array(
            array(
                "Ressource"=> "Stein",
                "PosX"=> 119,
                "PosY"=> 100,
                "Menge"=> "9791" 
            ),
            array( 
                "Ressource"=> "Stein",
                "PosX"=> 102,
                "PosY"=> 97,
                "Menge"=> "9991" 
            ),
            array( 
                "Ressource"=> "Stein",
                "PosX"=> 120,
                "PosY"=> 125,
                "Menge"=> "3603"
            )
);
$koords = array(
    array("PosX"=>109, "PosY"=>101),
    array("PosX"=>119, "PosY"=>100),    
    array("PosX"=>102, "PosY"=>97)    
);
 
  • Gefällt mir
Reaktionen: Joe
@timestamp
Ja dachte ich mir auch. Geht aber leider nicht das Array $data1 über die Datenbank auslese. Man könnte es zwar dann nochmal umschreiben aber ich brauche es genau so weil ich dann mit Domelementen drauf zugreife. Wäre also fast unlösbar es anders zu füllen und dann auszugeben.
Der Thread ist übrigens ein paar Threads weiter unten.

Weiss leider auch nicht wie ich auf die Array Indizies zugreifen könnte.
 
PHP:
$koords=array();
$count=count($koords);
for ($i=$NearestKoordsX1; $i<$NearestKoordsX2; $i++) {
	for ($j=$NearestKoordsY1; $j<$NearestKoordsY2; $j++) {
		$count++;
        $koords[$count]['PosX'] = $i;
        $koords[$count]['PosY'] = $j;  
	}
}
foreach($koords as $koord){
    $flag = false;
    foreach($data1 as $item){
        if($koord["PosX"]==$item["PosX"] && $koord["PosY"]==$item["PosY"]){
            $flag = true;
            break;
        }
    }
    if(!$flag){
       $newIndex = count($data1);
       $data1[$newIndex]["PosX"] = $koord["PosX"];
       $data1[$newIndex]["PosY"] = $koord["PosY"];
    }
}

Vielen Dank Yaslaw. So funktioniert es. Muss noch mal genauer schauen habe das Gefühl es überschreibt immernoch was. Nachdem ich nun jede Position habe lädt es nun auch demensprechend länger. microtime:0.740729093552

Edit: Nö bestens muss nur noch etwas den Domtree anpassen :)
 
Zuletzt bearbeitet:
Zurück