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
索引是子数组中的索引。此外,还不清楚如何阻止循环无限循环<代码>数量
在给出的示例中总是大于零,我看不出您是如何减少该值的。您只是想将其设置为零?为什么不直接分配它们呢?在执行另一个时执行块有什么特殊原因吗?您正试图将其设置为零?为什么不直接分配它们呢?当执行另一个块时,是否有任何特殊原因?