2014-10-08 108 views
0

我想在PHP中处理一个数组来生成一个新的数组。PHP数组循环与子循环

这种情况是我有一个销售请求数组,并希望从中产生票证请求。

我遇到的问题是,根据销售请求的类型,需要生成一个或多个票据。如果需要更多票证,唯一的区别是票证号码的后缀为-1或-2,并添加到常规票证号码中。

我能做的阵列上一个foreach然后IF/ELSE如果在销售类型,然后将所有新的数组键(这是除了票号都一样)

但因为我有很多销售要求/线路难以维护,我认为这对性能不利。

例 “半成品” 代码:

$ticket = array(); 

foreach ($input as $k=>$v) 
{ 
    $ticket[$k] ['exp_date'] = date('Y-m-d', strtotime('+1 year', strtotime($input[$k] ['sales_date']))); 
    $ticket[$k] ['ticket_number'] = input[$k] ['ticketnumber']; // if 1 day, ticket number, if 2 days ticket number + '-2' If multiple tickets are used, the first ticket should also have '-1' 
    $ticket[$k] ['ticket_type'] = $input[$k] ['product']; 
    $ticket[$k] ['sales_date'] = $input[$k] ['sales_date']; 
    $ticket[$k] ['sales_ticket_number'] = $input[$k] ['ticket_number'] ; 
    $ticket[$k] ['days'] = '0'; // not yet in use 
    $ticket[$k] ['days_remaining'] = '0'; // not yes in use 
} 

// if 

// if ($input[$k] ['product'] == '1-day') { $loop is null} 
// elseif ($input[$k] ['product'] == '2-days') { $loop is 2} 
// elseif ($input[$k] ['product'] == '3-days') { $loop is 3} 

建议/提示是非常感谢!

/EDIT

流程逻辑没有代码和次优:

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 
} 
+0

请加上'$ input'阵列的样品。 – RiggsFolly 2014-10-08 14:18:07

回答

1

从我个人理解,你想是这样的:

$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[$k](如您的代码)不能多次使用,因为数据将被覆盖。这就是为什么我使用$ticket[$k . '-' . $d]为每次销售的每一天生成一张入场券。由于票据数据的其余部分似乎相同,因此我可以先生成临时票证并在for循环中复制副本。输入

例子:

$input = array(
    'order_1234' => array(
    'sales_date' => '2013-12-31', 
    'product' => '1-day', 
    'ticket_number' => '1234', 
), 
    'order_5678' => array(
    'sales_date' => '2014-03-31', 
    'product' => '3-days', 
    'ticket_number' => '5678', 
), 
    ... 
); 

我的代码会产生这样的

$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', 
), 
    ... 
); 
+0

我仍然在看这个答案。不知道我是否理解它。目标是,ticket_type是例如“2天”,那么我需要在新阵列($票)2行。因此,1天一线的门票和多个门票的另一种类型。 – user3193469 2014-10-08 14:24:04

+0

这正是我的代码中发生的事情。我会给我的答案增加一些解释。 – Paul 2014-10-09 06:29:09

+0

它工作:)非常感谢。我更改了$ days部分,因为我发现产品可能有一个不代表票数的数字。例如'vv-12'应该循环4次。修复它与一个讨厌的4 IF语句。 – user3193469 2014-10-09 12:38:12

0

输出如果我理解正确的问题,我可能不会做,你可以这样做:

$prod = strpos($input[$k] ['product'], "-"); 
if ($prod == '1'): 
    $loop is null; 
else: 
    $loop is $prod; 
endif;