带子循环的php数组循环

带子循环的php数组循环,php,arrays,loops,Php,Arrays,Loops,我想用PHP处理一个数组以生成一个新数组 情况是,我有一个包含销售请求的数组,并希望从中生成票证请求 我遇到的问题是,根据销售请求的类型,需要重新查询一张或多张票才能生成。如果重新查询更多的车票,唯一的区别是车票号码的后缀为-1或-2 我可以在数组上执行foreach,然后在sales类型上执行IF/ELSE IF,然后设置所有新的数组键(除了票号之外都是相同的) 但是,由于我有很多销售请求/线路,这将很难维护,我认为这对性能不好 “半”代码示例: 非常感谢您的建议/提示 /编辑 无代码和次优的

我想用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;