我想在PHP中处理一个数组以生成一个新数组。
案例是我有一个包含销售请求的数组,并希望从中生成票证请求。
我遇到的问题是,根据销售请求的类型,会重新生成1张或更多票证。如果更多票证被重新兑换,唯一的区别是票证号码的后缀为-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 :(得分: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',
),
...
);
答案 1 :(得分:0)
如果我正确理解了这个问题,我可能没做过,你可以这样做:
$prod = strpos($input[$k] ['product'], "-");
if ($prod == '1'):
$loop is null;
else:
$loop is $prod;
endif;
答案 2 :(得分:0)
您可以创建一个包含除票号以外的所有元素的数组。
然后,对于每张票,您复制此阵列并添加票号。
不幸的是我没有找到比这更好的复制PHP数组的方法: http://php.net/manual/de/arrayobject.getarraycopy.php