Die Differenz von 2 Arrays feststellen mit array_diff_assoc

Mit anderen Worten es werden bei array_diff_assoc() nicht ausschließlich die Keys geprüft sondern die Key=>Value Paare.
Demnach sorry für meine Falsch-Information.
...
Achgott da stehts ja
array_diff_assoc — Computes the difference of arrays with additional index check
Wer lesen kann... ;)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Joe
Wenn ich die Beschreibung auf obiger Seite genau lese, dann ist immer das "längere", "größere" Array an erster Stelle!

@hela: Jetzt nimmst du ja auch das größere Array an erster Stelle, dann geht es so auch.

Wir sind uns somit hier alle einig.
Bin mal gespannt wann sich Joe - der es ja wissen wollte - auch mal wieder hier blicken lässt!?
 
Sorry das ich erst jetzt schreibe.

War mir garnicht bewusst das es wichtig ist wo welche Vergleichsvariable in der Funktion steht.

Dennoch so recht scheint die Funktion nicht zu funktionieren. Ob das mit Mehrdimmensionierten Feldern Probleme macht? Auf jden Fall bereiten mir die Arrays mehr Kopfzerbrechen als irgendwas sonst bisher.

Ich hatte vorher auch erst die Funktion array_diff und aus Verzweiflung auch mal assoc ausprobiert.

Jetzt hänge ich hier:
PHP:
$dataintersect=array_intersect($data1,$data2);
var_dump($data1):
PHP:
array(1) { [0]=>  array(2) { ["Plakette1"]=>  string(13) "Zeitungsleser" ["Plakette2"]=>  string(8) "Baumhaus" } }
var_dump($data2):
PHP:
array(3) { [0]=>  string(12) "Regalstapler" [1]=>  string(10) "Comicleser" [2]=>  string(8) "Baumhaus" }
var_dump($dataintersect);
PHP:
array(0) { }


Ich zeig euch mal das ganze Script damit euch klarer wird was ich da überhaupt machen will.
PHP:
if ('POST' == $_SERVER['REQUEST_METHOD']) {
    if (!isset($_POST['field'], $_POST['table'], $_POST['itemtable'], $_POST['formaction'])) {
        break;
    }
    // Feld leer
    if (('' == $field = ($_POST['field'])) OR
        ('' == $table = ($_POST['table'])) OR
        ('' == $itemtable = ($_POST['itemtable']))) {
        break;
    }
    
    //// Alle benötigten Plaketten zum jeweiligen Bauplan auslesen
    $getPlakettenliste="SELECT
                            Plakette1,
                            Plakette2
                        FROM
                            Plakettenliste
                        WHERE
                            Bauplan='$field'";
    if (mysql_errno()) {        
        echo mysql_errno() . ": " . mysql_error(). "\n";
    }
    $Plakettenliste = mysql_query($getPlakettenliste);
    // Wenn Plakettenliste zum Bauplan vorhanden ist dann,
    if(mysql_num_rows($Plakettenliste) != 0) {
        // alle bereits erworbenen Plaketten abrufen
        $getPlaketten = "SELECT
                            user.name,
                            PlakettenLager.*,
                            PlakettenBibliothek.*,
                            PlakettenBaumeister.*
                        FROM
                            (SELECT '{$Username}' AS name) AS user
                        LEFT JOIN PlakettenLager
                            ON PlakettenLager.Username = user.name
                        LEFT JOIN PlakettenBibliothek
                            ON PlakettenBibliothek.Username = user.name
                        LEFT JOIN PlakettenBaumeister
                            ON PlakettenBaumeister.Username = user.name";
        if (mysql_errno()) {        
            echo mysql_errno() . ": " . mysql_error(). "\n";
        }
        $Plaketten = mysql_query($getPlaketten);
        // Wenn User bereits Plaketten hat dann,
        if(mysql_num_rows($Plaketten) != 0) {
            // alle für Bauplan benötigten Plaketten in Array data1 schreiben.
            $row = mysql_fetch_assoc($Plakettenliste);
                    $data1[] = $row;
            
            /*while ($row = mysql_fetch_assoc($Plakettenliste)) {
                    $data1[] = $row;
            }*/
            // alle Relevanten Feldnamen der Tabelle Plaketten (welche bereits erworben wurden) ermitteln.
            while ($row1 = mysql_fetch_assoc($Plaketten)) {
                for ($i = 0; $i < mysql_num_fields($Plaketten); $i++) {
                    $field1=mysql_field_name($Plaketten, $i);
                    if (($row1[$field1] != 0) AND ($field1 != 'ID')) {
                        // erworbene Plaketten (Namen) in Array data2 schreiben
                        $data2[] = $field1;
                    }
                }
            }
            if (is_array($data2)) {
                // Arrays auf Schnittmenge vergleichen
                $dataintersect=array_intersect($data1,$data2);
                // Wenn Schnittmenge = alle erforderlichen Plaketten
                $datadiff=array_diff($data1, $dataintersect);
                $dataintersect2=array_intersect($dataintersect, $data2);
                if ((count($datadiff)==0) AND (count($dataintersect) != 0)) {
                //if ((count($dataintersect)==count($data1)) AND (count($dataintersect) != 0)  ) {
                    //// Studium in Datenbank auf erforscht stellen
                    mysql_query("UPDATE
                                    $table
                                SET
                                    $field=1
                                WHERE
                                    Username='$Username'");
                    if (mysql_errno()) {        
                        echo mysql_errno() . ": " . mysql_error(). "\n";
                    }    
                    if (mysql_affected_rows() == 0) {
                    // Datensatz zum ersten mal für den User erstellen
                        mysql_query("INSERT INTO
                                        $table
                                        (Username,$field)
                                    VALUES
                                        ('$Username','1')");
                        if (mysql_errno()) {        
                            echo mysql_errno() . ": " . mysql_error(). "\n";
                        }
                    }
    
                    //// verbrauchten Bauplan aus dem Inventar entfernen
                    mysql_query("UPDATE
                                    $itemtable
                                SET
                                    $field=$field-1
                                WHERE
                                    Username='$Username'");
                    if (mysql_errno()) {        
                        echo mysql_errno() . ": " . mysql_error(). "\n";
                    }
                    // Ausgabe Studium erfolgreich
                    echo "<p>Du hast den Bauplan für ".$field." erfolgreich studiert<br>
                            Der Bauplan wurde dabei völlig zerschlissen.</p>";
                    //echo "<meta http-equiv='refresh' content='3; URL=main.php?section=bauplan'>";
                }
                else {
                    echo "<p>Leider noch nicht alle Plaketten vorhanden.<br>
                            Es fehlen noch:</p>";
                    if (count($datadiff)!=0) {
                        for ($i = 0; $i < count($datadiff); $i++) {
                            echo "<p>Plakette für ".$datadiff[$i]."</p>";
                        }
                        var_dump($data1);
                        var_dump($data2);
                        var_dump($dataintersect);
                        //var_dump($datadiff);
                        echo "<p>relevante Stelle im Script</p>";
                    }                    
                    else {
                        for ($i = 0; $i < count($data1); $i++) {
                            if ($data1[$i] != '') {
                                echo "<p>Plakette ".$data1[$i]."</p>";
                            }
                        }
                    }
                }
            }
            else {
                echo "<p>TODO</p>";
            }
        }
        if(mysql_num_rows($Plaketten) == 0) {
            echo "<p>TODO</p>";
        }
    }
    if(mysql_num_rows($Plakettenliste) == 0) {
        echo "<p>Sorry Liste der benötigten Plaketten noch nicht erstellt. Dieser Bauplan kann noch nicht studiert werden.</p>";
    }
}


Das array_intersect muss freilich erst funktionieren bevor ich sagen kann ob array_diff nun richtig arbeietet. Das Problem war gestern noch nicht ersichtlich durch das ganze debugging.

Übrigens Vielen Dank für die ganzen Antworten :)
 
Das wird nicht gehen weil $data1 ein Mehrdimensionales Array ist.(wie du schon richtig bemerkt hast)
Also entweder du übergibst $data1[0] oder du machst das array "flach" (eindimensional).
PHP:
$data1 = array( array("Plakette1"=>"Zeitungsleser","Plakette2"=>"Baumhaus"));
$data2 = array("Regalstapler","Comicleser","Baumhaus");

$dataintersect=array_intersect($data1[0],$data2);

var_dump($dataintersect);

/*
array(1) { ["Plakette2"]=>  string(8) "Baumhaus" } 
*/
 
  • Gefällt mir
Reaktionen: Joe
Hmkey scheint erst mal zu funktionieren habe diese Zeile bei mysql_fetch_assoc -
PHP:
            $row = mysql_fetch_assoc($Plakettenliste);
                    $data1[] = $row;
mit diesen ersetzt:
PHP:
			$row = mysql_fetch_assoc($Plakettenliste);
					$data1[] = $row['Plakette1'];
					$data1[] = $row['Plakette2'];

Dann stimmen auch die Var_dump.
var_dump($data1):
PHP:
array(2) { [0]=>  string(13) "Zeitungsleser" [1]=>  string(8) "Baumhaus" }
var_dump($data2):
PHP:
array(3) { [0]=>  string(12) "Regalstapler" [1]=>  string(10) "Comicleser" [2]=>  string(8) "Baumhaus" }
var_dump($dataintersect);
PHP:
array(1) { [1]=>  string(8) "Baumhaus" }

So wird also eine Übereinstimmung gefunden. Offensichtlich sind die Keys bei den Arrays auch wichtig bei array_diff und array_intersect.

Differenziert betrachtet gibt es immer eine Differenz bei 2 verschiedenen Arrays. Da hätte die Funktion bald eher den Namen array_subtract heissen sollen.

Also danke für die Tipps :)
 
Falls es noch jemand intressiert musste die Ausgabe der Arrays folgendermassen abändern:
PHP:
					echo "<p>Leider noch nicht alle Plaketten vorhanden.<br>
							Es fehlen noch:</p>";
					if (count($dataintersect2)!=0) {
						$Anz= max(array_keys($dataintersect2));
						for ($i=0; $i <= $Anz; $i++) {
							if ($dataintersect2[$i]) {
								echo "<p>Plakette für ".$dataintersect2[$i]."</p>";
							}
						}
                    }

Ich erwähne das deshalb weil array_intersect und array_diff manchmal den Key verändern. Die vorherige Schleife in meinen Script würde dann schlicht nicht funktionieren da die Schleife nicht soweit zählt.
 
Zuletzt bearbeitet:
Zurück