2016-07-20 7 views
0

Hier ist eine Funktion, die ich schreibe:foreach und While-Schleifen ein Array mit Daten duplizieren

function createDeck($deckId) { 
    global $dbConnection; 
    $queryCreateDeck = "SELECT c.card_name, dc.qty 
            FROM decks AS d 
             JOIN decks_to_cards AS dc 
             ON d.deck_id = dc.deck_id 
             JOIN cards AS c 
             ON dc.card_id = c.card_id 
            WHERE d.deck_id = {$deckId} 
            ORDER BY c.card_name"; 
    $createDeck = mysqli_query($dbConnection, $queryCreateDeck); 

    $deckArray = array(); 
    $deckFinal = array(); 
    while ($deck = mysqli_fetch_assoc($createDeck)) { 
     $deckArray[] = $deck; 
    }; 
    foreach ($deckArray["card_name"] as $card) { 
     while($deckArray["qty"] > 0) { 
      array_push($deckFinal, $deckArray["card_name"]); 
     }; 
    }; 
    print_r($deckArray); 

}; 

Dies ist, was das Array $deckArray ausgibt:

Array ( 
    [0] => Array ( 
     [card_name] => Archangel Avacyn 
     [qty] => 4 
    ) 
    [1] => Array ( 
     [card_name] => Canopy Vista 
     [qty] => 4 
    ) 
    [2] => Array ( 
     [card_name] => Dromoka's Command 
     [qty] => 4 
    ) 
    [3] => Array ( 
     [card_name] => Evolutionary Leap 
     [qty] => 2 
    ) 
    4] => Array ( 
     [card_name] => Forest 
     [qty] => 9 
    ) 
    [5] => Array ( 
     [card_name] => Fortified Village 
     [qty] => 4 
    ) 
    [6] => Array ( 
     [card_name] => Gideon, Ally of Zendikar 
     [qty] => 4 
    ) 
    [7] => Array ( 
     [card_name] => Hangarback Walker 
     [qty] => 4 
    ) 
    [8] => Array ( 
     [card_name] => Nissa, Voice of Zendikar 
     [qty] => 4 
    ) 
    [9] => Array ( 
     [card_name] => Oath of Nissa 
     [qty] => 4 
    ) 
    [10] => Array ( 
     [card_name] => Plains 
     [qty] => 7 
    ) 
    [11] => Array ( 
     [card_name] => Secure the Wastes 
     [qty] => 2 
    ) 
    [12] => Array ( 
     [card_name] => Sylvan Advocate 
     [qty] => 4 
    ) 
    [13] => Array ( 
     [card_name] => Tragic Arrogance 
     [qty] => 2 
    ) 
    [14] => Array ( 
     [card_name] => Westvale Abbey 
     [qty] => 2 
    ) 
) 

Ich versuche, eine zu schaffen Array mit einer Instanz jedes card_name für die Menge in diesem Array.

Es wirft einen Fehler an den foreach und nachfolgenden while-Schleifen, die mir sagen, dass der Index nicht korrekt ist.

Aber wenn ich das Array anschaue, scheint es, dass dies die Indizes sind. Jede Hilfe würde sehr geschätzt werden, ich habe mein Gehirn darüber zerbrochen.

+0

Meine ersten Gedanken sind das, weil irgendwie der Schlüssel => Wert nicht geblieben ist und es nicht mehr ein assoziatives Array ist. Nicht sicher, obwohl. – user296868

+0

warum nicht '' 'in der Abfrage selbst? – Ghost

+0

würden Sie bitte Ihre gewünschte Ausgabe hinzufügen –

Antwort

2

Wenn Sie nur versuchen, mit Bedingungen WHERE qty > 0 herauszufiltern, warum tun Sie es nicht einfach innerhalb der Abfrage, dann erhalten Sie die Kartennamen (das übliche Holen). Viel kürzere Strecke.

Sollte gehen Sie mit der PHP-Route, tun Sie es einfach innerhalb des while Block:

$deckFinal = array(); 
while ($deck = mysqli_fetch_assoc($createDeck)) { 
    if($deck['qty'] > 0) { // greater than zero 
     $deckFinal[] = $deck['card_name']; // push card name 
    } 
} 

Keine Notwendigkeit, in einen anderen Behälter neu zuweisen, dann einen anderen Filter machen in ein anderes Array zu übergeben.

Ich würde einen Schritt weiter gehen, indem ich vorbereitete Anweisungen verwende, injiziere Variablen nicht direkt in deine Abfrageanweisung.

Verwenden Platzhalter statt:

function createDeck($dbConnection, $deckId) { 
    $queryCreateDeck = ". 
     SELECT c.card_name, dc.qty 
      FROM decks AS d 
      JOIN decks_to_cards AS dc 
       ON d.deck_id = dc.deck_id 
       JOIN cards AS c 
       ON dc.card_id = c.card_id 
      WHERE d.deck_id = ? 
      AND dc.qty > 0 
      ORDER BY c.card_name 
    "; 
    $createDeck = $queryCreateDeck->prepare($queryCreateDeck); 
    $createDeck->bind_param('i', $deckId); 
    $createDeck->execute(); 
    $createDeck->bind_result($card_name, $qty); 

    $deckFinal = array(); 
    while ($createDeck->fetch())) { 
     $deckFinal[] = $card_name; 
     // $deckFinal[] = ['card_name' => $card_name, 'qty' => $qty]; 
    } 

    return $deckFinal; 
} 
0

Dies gab mir das gewünschte Ergebnis, ich habe nur den gesamten Prozess Grübeln. Danke Jungs!

+0

Sie versuchen, es auf Null zu setzen? Warum ordne ich sie nicht einfach zu? Gibt es einen besonderen Grund dafür, einen weiteren "while" Block zu machen? – Ghost