我正在尝试提出一种方法来有效地为以下数据/查询创建分页。
问题:
我将销售存储在关联数组$data['summary'][$SALE_ID]
和$ data ['详细信息'] [$ SALE_ID]`中。我需要保持秩序。我不确定php关联数组是否保持顺序。
我想要一个简单的方法,例如array_slice
来获取我需要显示的数据集。我无法弄清楚如何做到这一点。我试过
$data['summary'] = array_slice($data['summary'], $offset, $limit, TRUE)
,但我不确定这是否是最好的方法
public function getData()
{
$data = array();
$data['summary'] = array();
$data['details'] = array();
$offset = $this->params['offset'];
$limit = $this->params['limit'];
//Returns 1 row for each item per sale. This means if the sale has 2 items, there will be two results per sale
$sales_items_rows = $this->get_all_sale_items();
foreach($sales_items_rows as $sale_item_row)
{
if (!isset($data['summary'][$sale_item_row['sale_id']]))
{
$data['summary'][$sale_item_row['sale_id']] = array(
'sale_id' => $sale_item_row['sale_id'],
'sale_time' => $sale_item_row['sale_time'],
'sale_date' => $sale_item_row['sale_date'],
'employee_name' => $sale_item_row['employee_name'],
'customer_id' => $sale_item_row['customer_id'],
'customer_name' => $sale_item_row['customer_name'],
'payment_type'=> $sale_item_row['payment_type'],
'comment'=> $sale_item_row['comment'],
'items_purchased' => 0,
'subtotal' => 0,
'total' => 0,
'tax' => 0,
'profit' => 0,
);
}
$data['summary'][$sale_item_row['sale_id']]['items_purchased']+=$sale_item_row['quantity_purchased'];
$data['summary'][$sale_item_row['sale_id']]['subtotal']+=$sale_item_row['subtotal'];
$data['summary'][$sale_item_row['sale_id']]['total']+=$sale_item_row['total'];
$data['summary'][$sale_item_row['sale_id']]['tax']+=$sale_item_row['tax'];
$data['summary'][$sale_item_row['sale_id']]['profit']+=$sale_item_row['profit'];
$data['details'][$sale_item_row['sale_id']][] = $sale_item_row;
}
$data['summary'] = array_slice($data['summary'], $offset, $limit, TRUE)
$data['details'] = array_slice($data['details'], $offset, $limit, TRUE)
return $data;
}
答案 0 :(得分:1)
首先:从数据库中获取所有项目,处理所有项目,然后只抓取一个子集,对于数据库和php本身都是非常低效的。考虑限制(使用偏移量)从数据库返回的结果集!!
如果由于某种原因真的不可能,是的,你可以使用一个阵列。由于数组被定义为有序映射,因此无论您对数组执行什么操作,都将保持顺序。当然,有很多功能可以改变顺序(例如所有的排序函数),但通常你可以相信数组的顺序与你创建它的顺序相同。
但还有另一种选择:为什么不让php自己创建索引?截至目前,您将相关行存储为ID作为索引,但您也可以将ID存储为值,并使用' auto-incremental'指数。这几乎就是数据库实际返回数据的方式......
所以而不是:
$data['summary'][$sale_item_row['sale_id']] = array(
'items_purchased' => $sale_item_row['quantity_purchased'],
...
);
你会这样做:
$data['summary'][] = array(
'sale_id' => $sale_item_row['sale_id'],
'items_purchased' => $sale_item_row['quantity_purchased'],
...
);
现在您拥有一张完美有序的地图,其中包含递增的索引,并且销售ID为“'属性”。你的行。