PHP / MySQL / Jquery - 构建关联数组并使用 JQuery $.each 输出它
Posted
技术标签:
【中文标题】PHP / MySQL / Jquery - 构建关联数组并使用 JQuery $.each 输出它【英文标题】:PHP / MySQL / Jquery - Building associative array and outputing it using JQuery $.each 【发布时间】:2019-09-13 06:40:48 【问题描述】:我正在构建一个日历 (FullCalendar),它显示每天的订单以及单击订单时订购的商品。当 $order_info 被放入 $data 数组时,它会丢失某些数据行,如下面的第 4 个代码块所示。我试图弄清楚如何将数组放在一起,以便应该显示的每个描述(键)都与正确的数量(值)配对,然后使用 jquery 中的 $.each 函数进行迭代。
当我从表中查询 $desc 和 $qty 变量时,它们会被连接起来,因此我使用了 explode 函数来分隔它们的值。
foreach($sql_query as $row)
$desc = array_map('trim', explode(',', $row['OlineDesc']));
$qty = array_map('trim', explode(',', $row['OlineQty']));
$order_info = array_combine($desc, $qty);
$data[] = array (
'start' => $row['OrderDate'],
'order_id' => $row['OrderID'],
'desc_qty' => $order_info
);
在foreach的结束标签之后打印出数组:
echo "<pre>";
echo print_r($data);
echo "</pre>";
输出:
// Output when print_r($data)
[0] => Array
(
[start] => 2019-05-11 16:00:00
[order_id] => 2509
[description] => Time: 04:00PM
[desc_qty] => Array
(
[#4 Beef and Pizza Special] => 1
[6 Lbs Italian Beef] => 1
[**incl Brd + Au Jus] => 1
[**incl Sweet Peppers] => 1
[**incl Hot Giardiniera] => 1
[XL 18" Pizza] => 1
[SAUSAGE] => 1
)
)
如果我使用 array_merge 而不是 array_combine 来加入我的数组,它首先将所有键和值合并为所有键,然后是值...但它至少显示每一行,而不是有限的行数:
$order_info = array_merge($desc, $qty);
// Output when print_r($order_info)
[desc_qty] => Array
(
[0] => #4 Beef and Pizza Special
[1] => 6 Lbs Italian Beef
[2] => **incl Brd + Au Jus
[3] => **incl Sweet Peppers
[4] => **incl Hot Giardiniera
[5] => XL 18" Pizza
[6] => SAUSAGE
[7] => XL 18" Pizza
[8] => XL 18" Pizza
[9] => 1
[10] => 1
[11] => 1
[12] => 1
[13] => 1
[14] => 1
[15] => 1
[16] => 1
[17] => 1
)
然后我使用绑定到 onClick 事件的 jquery 将信息加载到 div 中,其中键是项目的描述,值是数量:
$.each( event.desc_qty, function( key, value )
document.getElementById("party_info").innerhtml += "<span class="+key+">" + key + "<span id='sum_"+key+"'>" + value + "</span></span>";
);
我的代码当前输出:
#4 Beef and Pizza Special 1
6 Lbs Italian Beef 1
**incl Brd + Au Jus 1
**incl Sweet Peppers 1
**incl Hot Giardiniera 1
XL 18" Pizza 1
SAUSAGE 1
我想要达到的预期输出:
#4 Beef and Pizza Special 1
6 Lbs Italian Beef 1
**incl Brd + Au Jus 1
**incl Sweet Peppers 1
**incl Hot Giardiniera 1
XL 18" Pizza 1
SAUSAGE 1
XL 18" Pizza 1
XL 18" Pizza 1
任何帮助或指导将不胜感激!谢谢!
编辑:
这是我的 SQL 查询。我正在使用 3 个不同的表来收集与 ID 匹配的所有信息,以提取正确的信息。
SELECT a.OrderDate, a.OrderID, a.OrdCustName, a.OrdPhone, b.OtotOrder,
b.OtotTotal, c.OlineOrder, GROUP_CONCAT(c.OlineDesc SEPARATOR ',') as
'OlineDesc', GROUP_CONCAT(FLOOR(COALESCE(c.OlineQty,'1'))) as
'OlineQty'
FROM db.tbldeferredorders a, db.tbldeferredordtotals b,
db.tbldeferredordlines c
WHERE a.OrderID = b.OtotOrder AND a.OrderID = c.OlineOrder
AND a.OrderDate >= NOW() - INTERVAL 3 MONTH
GROUP BY a.OrderID
此查询会将 OlineDesc 列拉入一个连接字符串,如下所示。每个逗号都来自一个单独的行,我根据 a.OrderID 将它们组合在一起。所以对于这个特定的行,OrderID 是“2536”。
'#4 Beef and Pizza Special,6 Lbs Italian Beef,**incl Brd + Au
Jus,**incl Sweet Peppers,**incl Hot Giardiniera,XL 18" Pizza,XL 18"
Pizza,SAUSAGE,XL 18" Pizza,PEPPERONI,Lrg Caesar Salad,** ceaser
dressing,Lg 3 Cheese Baked Penne'
当我运行查询时,OlineQty 列如下所示:
'1,1,1,1,1,1,1,1,1,1,1,1,1'
【问题讨论】:
这里缺少的部分是查询本身,但我认为 array_combine 没有按照您需要的方式处理重复键。您可以通过优化您的查询来解决这个问题,或者只是创建一个循环以从您从查询中获得的两个数组构建您的desc_qty
数组。我将从查询开始;它应该能够以您需要的形式为您提供所需的数据。
@Jerry,你说得对,array_combine 没有以我需要的方式处理我的重复键。更改我的查询被证明很困难,因为我正在使用的数据不是最好的,所以我认为由于两个数组具有相同数量的值,我将它们分成 2 并使用我的 jquery $.each 循环将键配对在一起.感谢您试图引导我朝着正确的方向前进!
我认为您实际上正在寻找的是一个循环,该循环计算每个键出现的次数。如果您显示查询,我仍然相信这将导致最佳解决方案。
@Jerry 我编辑了我的原始帖子,其中显示了我的 SQL 查询以及字符串是如何连接的。编辑:另外,即使我找到了一个不太优雅的解决方案,我也很感谢你在这里为我提供帮助。
【参考方案1】:
这可能不是最优雅的解决方案,但我找到了解决问题的方法。我发现 array_combine 不能有重复的键,所以我决定使用 2 而不是只有一个数组循环通过它,然后我将它与 qty[key] 配对,因为它正在通过每个循环。这与它逐行匹配。
$.each( event.desc, function( key, value )
document.getElementById("party_info").innerHTML += "<span class="+value+">" + key + "<span id='sum_"+value+"'>" + event.qty[key] + "</span></span>";
);
【讨论】:
以上是关于PHP / MySQL / Jquery - 构建关联数组并使用 JQuery $.each 输出它的主要内容,如果未能解决你的问题,请参考以下文章
复选框状态更改时如何更新mysql字段?使用 jquery (ajax)、php 和 mysql
在 PHP 和 Mysql 的 jquery datepickers 中禁用给定范围内的日期