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

用 jQuery/AJAX 更新 MYSQL

在 PHP 和 Mysql 的 jquery datepickers 中禁用给定范围内的日期

PHP Jquery:聊天系统,啥是理想的框架?

使用 NodeJS 和 JSDOM/jQuery 从代码片段构建 PHP 页面

数据校验php/mysql/jquery