带子循环的php数组循环
我想用PHP处理一个数组以生成一个新数组 情况是,我有一个包含销售请求的数组,并希望从中生成票证请求 我遇到的问题是,根据销售请求的类型,需要重新查询一张或多张票才能生成。如果重新查询更多的车票,唯一的区别是车票号码的后缀为-1或-2 我可以在数组上执行foreach,然后在sales类型上执行IF/ELSE IF,然后设置所有新的数组键(除了票号之外都是相同的) 但是,由于我有很多销售请求/线路,这将很难维护,我认为这对性能不好 “半”代码示例: 非常感谢您的建议/提示 /编辑 无代码和次优的流程逻辑:带子循环的php数组循环,php,arrays,loops,Php,Arrays,Loops,我想用PHP处理一个数组以生成一个新数组 情况是,我有一个包含销售请求的数组,并希望从中生成票证请求 我遇到的问题是,根据销售请求的类型,需要重新查询一张或多张票才能生成。如果重新查询更多的车票,唯一的区别是车票号码的后缀为-1或-2 我可以在数组上执行foreach,然后在sales类型上执行IF/ELSE IF,然后设置所有新的数组键(除了票号之外都是相同的) 但是,由于我有很多销售请求/线路,这将很难维护,我认为这对性能不好 “半”代码示例: 非常感谢您的建议/提示 /编辑 无代码和次优的
foreach ($input as $k=>$v)
{
if ( $input[$k] ['product'] == '1-day')
{
create new lines in new array
}
else if ( $input[$k] ['product'] == '2-days')
{
loop 2 times
create same entries, but ticket number = ticketnumber-1 and second loop ticketnumber-2
}
据我所知,你想要这样的东西:
$ticket = array ();
foreach ( $input as $k=>$v )
{
// add the shared data for all tickets of one product to temporary ticket
$temp_ticket['exp_date'] = date('Y-m-d', strtotime('+1 year', strtotime($input[$k] ['sales_date'])) );
$temp_ticket['ticket_type'] = $input[$k]['product'];
$temp_ticket['sales_date'] = $input[$k]['sales_date'];
$temp_ticket['sales_ticket_number'] = $input[$k]['ticket_number'] ;
$temp_ticket['days'] = '0'; // not yet in use
$temp_ticket['days_remaining'] = '0'; // not yes in use
// get 'product' and retrieve the number of days
$days = (int) $input[$k]['product']; // '1-day' becomes 1, '2-days' becomes 2, ...
for ($d = 1; $d <= $days; $d++) {
// loop through the number of days and add to ticket array
// creates one ticket for each day of a product
$ticket[$k . '-' . $d] = $temp_ticket;
$ticket[$k . '-' . $d]['ticket_number'] = input[$k]['ticketnumber'] . '-' . $d;
}
}
我的代码将产生如下输出
$ticket = array(
'order_1234-1' => array(
'exp_date' => '2014-12-31',
'sales_date' => '2013-12-31',
'ticket_type' => '1-day',
'sales_ticket_number' => '1234',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '1234-1',
),
'order_5678-1' => array(
'exp_date' => '2015-03-31',
'sales_date' => '2014-03-31',
'ticket_type' => '3-days',
'sales_ticket_number' => '5678',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '5678-1',
),
'order_5678-2' => array(
'exp_date' => '2015-03-31',
'sales_date' => '2014-03-31',
'ticket_type' => '3-days',
'sales_ticket_number' => '5678',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '5678-2',
),
'order_5678-3' => array(
'exp_date' => '2015-03-31',
'sales_date' => '2014-03-31',
'ticket_type' => '3-days',
'sales_ticket_number' => '5678',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '5678-3',
),
...
);
如果我正确理解了问题(我可能没有理解),您可以:
$prod = strpos($input[$k] ['product'], "-");
if ($prod == '1'):
$loop is null;
else:
$loop is $prod;
endif;
您可以创建一个包含除票证号之外的所有元素的数组 然后,对于每个票据,复制此数组并添加票据编号 不幸的是,我没有找到比这更好的复制PHP数组的方法:
请添加一个
$input
数组的示例。我还在看这个答案。我还不确定我是否完全理解它。目标是,如果票证类型为“2天”,那么我需要在新数组中输入2行($ticket)。因此,1行表示1天的票,多行表示另一种类型的票。这正是我的代码中所发生的。我会给我的答案再加上一些解释。它是有效的:)非常感谢。我更改了$days部分,因为我发现产品可能有一个不代表票数的数字。例如“vv-12”应循环4次。用讨厌的4IF语句修复了它。
$ticket = array(
'order_1234-1' => array(
'exp_date' => '2014-12-31',
'sales_date' => '2013-12-31',
'ticket_type' => '1-day',
'sales_ticket_number' => '1234',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '1234-1',
),
'order_5678-1' => array(
'exp_date' => '2015-03-31',
'sales_date' => '2014-03-31',
'ticket_type' => '3-days',
'sales_ticket_number' => '5678',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '5678-1',
),
'order_5678-2' => array(
'exp_date' => '2015-03-31',
'sales_date' => '2014-03-31',
'ticket_type' => '3-days',
'sales_ticket_number' => '5678',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '5678-2',
),
'order_5678-3' => array(
'exp_date' => '2015-03-31',
'sales_date' => '2014-03-31',
'ticket_type' => '3-days',
'sales_ticket_number' => '5678',
'days' => '0',
'days_remaining' => '0',
'ticket_number' => '5678-3',
),
...
);
$prod = strpos($input[$k] ['product'], "-");
if ($prod == '1'):
$loop is null;
else:
$loop is $prod;
endif;