Php foreach和while循环使用数组复制数据

Php foreach和while循环使用数组复制数据,php,mysql,arrays,Php,Mysql,Arrays,下面是我正在编写的函数: function createDeck($deckId) { global $dbConnection; $queryCreateDeck = "SELECT c.card_name, dc.qty FROM decks AS d JOIN decks_to_cards AS dc

下面是我正在编写的函数:

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);

};
这是数组
$deckArray
输出的内容:

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
    ) 
)
我正在尝试创建一个数组,其中包含该数组中数量的每个卡片名称的实例

它在foreach和后续循环中抛出一个错误,同时告诉我索引不正确


但是,当我查看数组时,似乎这些确实是索引。任何帮助都将不胜感激,我一直在为此绞尽脑汁。

如果您只是想用条件过滤掉qty>0,为什么不在查询中进行过滤,然后获取卡片名称(通常的抓取)。那条路要短得多

如果转到PHP路径,只需在
while
块中执行即可:

$deckFinal = array();
while ($deck = mysqli_fetch_assoc($createDeck)) {
    if($deck['qty'] > 0) { // greater than zero
        $deckFinal[] = $deck['card_name']; // push card name
    }
}
无需重新分配到另一个容器,然后使另一个筛选器传递到另一个数组中

我会更进一步,使用预先准备好的语句,不要直接在查询语句中注入变量

请改用占位符:

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;
}

如果您只是尝试使用条件
WHERE qty>0
进行筛选,为什么不在查询中进行筛选,然后获取卡片名称(通常的提取)。那条路要短得多

如果转到PHP路径,只需在
while
块中执行即可:

$deckFinal = array();
while ($deck = mysqli_fetch_assoc($createDeck)) {
    if($deck['qty'] > 0) { // greater than zero
        $deckFinal[] = $deck['card_name']; // push card name
    }
}
无需重新分配到另一个容器,然后使另一个筛选器传递到另一个数组中

我会更进一步,使用预先准备好的语句,不要直接在查询语句中注入变量

请改用占位符:

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;
}

这给了我想要的结果,我只是过度思考了整个过程。谢谢你们

while ($deck = mysqli_fetch_assoc($createDeck)) {
             while($deck['qty'] > 0) {
                $deck['qty']--; 
                $deckFinal[] = $deck['card_name']; // push card name
            };
        };

这给了我想要的结果,我只是过度思考了整个过程。谢谢你们

while ($deck = mysqli_fetch_assoc($createDeck)) {
             while($deck['qty'] > 0) {
                $deck['qty']--; 
                $deckFinal[] = $deck['card_name']; // push card name
            };
        };

我首先想到的是,key=>值并没有保留下来,它不再是一个关联数组。但是不确定。为什么不在查询本身内部执行该操作呢?请添加所需的输出。在我看来,
$deckArray
是多维的,而
card\u name
索引是子数组中的索引。此外,还不清楚如何阻止
循环无限循环<在给定的示例中,code>qty
始终大于零,我根本看不出您是如何减少该值的。我首先想到的是,这是因为key=>值没有保留下来,它不再是关联数组。但是不确定。为什么不在查询本身内部执行该操作呢?请添加所需的输出。在我看来,
$deckArray
是多维的,而
card\u name
索引是子数组中的索引。此外,还不清楚如何阻止
循环无限循环<代码>数量
在给出的示例中总是大于零,我看不出您是如何减少该值的。您只是想将其设置为零?为什么不直接分配它们呢?在执行另一个
时执行
块有什么特殊原因吗?您正试图将其设置为零?为什么不直接分配它们呢?当执行另一个
块时,是否有任何特殊原因?