用php处理mysql数组


process mysql array with php

我有一个来自数据库的数组,我想用php 格式化和显示

Array ( 
  [customer] => Array ( 
    [customer_id] => 1 
    [firstname] => Mitchell 
    [lastname] => Bray 
    [order_id] => 3 
    [date_added] => 2012-01-17 11:22:30 
    [name] => iPod Shuffle 
    [quantity] => 1 
  ) 
)
Array ( 
  [customer] => Array ( 
    [customer_id] => 1 
    [firstname] => Mitchell 
    [lastname] => Bray 
    [order_id] => 3 
    [date_added] => 2012-01-17 11:22:30 
    [name] => iPod Touch 
    [quantity] => 1 
  ) 
)  
Array ( 
  [customer] => Array ( 
    [customer_id] => 1 
    [firstname] => Mitchell 
    [lastname] => Bray 
    [order_id] => 14 
    [date_added] => 2012-01-25 08:39:54 
    [name] => iPod Touch 
    [quantity] => 2 
  ) 
) 
Array ( 
  [customer] => Array ( 
    [customer_id] => 1 
    [firstname] => Mitchell 
    [lastname] => Bray 
    [order_id] => 14 
    [date_added] => 2012-01-25 08:39:54 
    [name] => HTC Touch HD 
    [quantity] => 3 
  ) 
) 
Array ( 
  [customer] => Array ( 
    [customer_id] => 2 
    [firstname] => M 
    [lastname] => Bray 
    [order_id] => 15 
    [date_added] => 2012-02-02 14:33:45 
    [name] => HTC Touch HD 
    [quantity] => 1 
  ) 
)

我想显示这样的东西:

Mitchell Bray
iPod Shuffle qty 3
iPod Touch qty 3
HTC Touch HD qty 3
M Bray
HTC Touch HD qty 1

添加了sql查询,如果这有助于

$sql =  "
    select c.customer_id, c.firstname, c.lastname, 
           o.order_id, o.date_added, 
           op.name, op.quantity
      from `" . DB_PREFIX . "customer` c
      inner join `" . DB_PREFIX . "order` o on o.customer_id = c.customer_id
      inner join `" . DB_PREFIX . "order_product` op on o.order_id = op.order_id";

您应该使用group-by.修改查询如下:

$sql =  "select c.customer_id, c.firstname, c.lastname, 
                   o.order_id, o.date_added, 
                   op.name, sum(op.quantity)
            from `" . DB_PREFIX . "customer` c
            inner join `" . DB_PREFIX . "order` o on o.customer_id = c.customer_id
            inner join `" . DB_PREFIX . "order_product` op on o.order_id = op.order_id
group by c.customer_id, op.name
";

检查更新答案:

$sql =  "select c.customer_id, c.firstname, c.lastname, op.name, sum(op.quantity)
                from `" . DB_PREFIX . "customer` c
                inner join `" . DB_PREFIX . "order_product` op on o.order_id = op.order_id
    group by c.customer_id, op.name
    ";

更新2:

$sql =  "select *, sum(quantity)  from (select c.customer_id, c.firstname, c.lastname, op.quantity     from `" . DB_PREFIX . "customer` c
                inner join `" . DB_PREFIX . "order` o on o.customer_id = c.customer_id
                inner join `" . DB_PREFIX . "order_product` op on o.order_id = op.order_id
) result
    group by result.customer_id, result.name
    ";
$customers = array();
foreach ($data as $key => $values) {
    if (!isset($customers[$values['id']])) {
        $name = $values['firstname'].' '. $values['lastname'];  
        $customers[$values['id']]['name'] = $name;
    } else {
        $customers[$values['id']]['order'][] = $values['name']. ' '. $values['quantity'];
    }
}
foreach ($customers as $customer) {
    $string = $customer['name'] . '<br/>';
    foreach ($customer['order'] as $oder) {
        $string .= $oder. '<br/>';
    }
    print $string;
} 

可能是您正在为客户下订单时选择的每个产品运行插入语句,或者您的数据库没有规范化。

我的建议是维护一个购物车,买家可以在其中添加商品,然后在确认订单时生成一个逗号或分号分隔的商品列表,并将该字符串存储在数据库列中。当你稍后取回它时,你会得到一个字符串,你可以分解它来获得独立的元素。

更好的方法是将itemid存储为串联字符串,而不是它们的名称。这是您的所有订单详细信息,属于该订单的项目将在一行中,而不是同一订单的多行中。

你的数据库表可能看起来像

customerid orderid项ordertime1 3 23,6,35,41201201-17 11:22:30

当您分解包含该购买中物品id的物品字符串后,您将获得一个物品id的数组

[23,6,35,41]
您可以使用itemid来获取项目的详细信息。

如果你也想存储像(ipod x 3)这样的项目数量,你可以将项目字符串存储为

itemid,quantily;itemid,数量;itemid,数量