2017-06-12 55 views
1

背景创建于一体的foreach迭代一个键值对,而在另一个

我想在一个给定的比赛找出一个足球(足球运动员)的实际播放时间重新分配的值。换句话说,他作为一名积极球员在场上的时间。

一些用户输入的数据提供:

  • 如果当球员被替换下场,而他是否埋入式或关闭
  • 玩家是否开始在球场上还是在板凳上比赛
  • 的开始和结束时间戳为比赛的每一半

问题

我试图创建一对事件,它们表示实际播放时间的“单位”。在本例中,在最外面的foreach的第一次迭代中,我创建了一个数组:

$aptPeriods = array( 'start' => 32, 'end' => '' ) 在第二次迭代中,脚本标识空'结束'值,并尝试重新分配它。

$playerSubstitutions = array(
    array(
     'type' => 'on', 
     'time' => '38' 
    ), 
    array(
     'type' => 'off', 
     'time' => '68' 
    ) 
); 

foreach($playerSubstitutions as $sub) { 
    // If the sub type is 'on', create a new aptPeriod and set the 'end' time to nothing 
    if($sub['type'] == 'on') { 
     $subOnEvent = array(
      'start' => $sub['time'], 
      'end' => '' 
     ); 
     array_push($aptPeriods, $subOnEvent); 
    // If the sub type is 'off', scan the aptPeriods array for an empty 'end' value, then set it to the subOff time 
    } elseif($sub['type'] == 'off') { 
     foreach($aptPeriods as $period) { 
      if($period['end'] == '') { 
       $period['end'] == $sub['time']; 
      } 
     } 
    } 
} 

echo '<pre>'; print_r($aptPeriods); echo '</pre>'; 

这将返回:

Array 
(
    [0] => Array 
     (
      [start] => 38 
      [end] => 
     ) 

) 

最里面的foreach肯定是执行和$sub['time']是绝对确定,但空白“结束”值不被重新分配。我哪里错了?

+0

此代码似乎相当不登大雅之堂。你能解释一下它究竟意味着什么吗?并提供其他几个不同的输入数组?必须有一个更高效/干净的方式来做到这一点。 – mickmackusa

+0

好点。请参阅编辑的问题。 – devbox

+0

如果玩家不是“开始”玩家(坐着开始比赛),输入阵列是什么样的?如果玩家在场上开始怎么办?如果我能看到数据的结构,我可以提出改进建议。 – mickmackusa

回答

1

如果要修改原来的值,则使用...

 foreach($aptPeriods as &$period) { 
      if($period['end'] == '') { 
       $period['end'] = $sub['time']; 
      } 
     } 
    unset ($period); 

(请注意,在$时期位&)

在foreach是使每个数组元素,你的副本正在修改它而不是原始数组。

另外 - 正如指出的那样,赋值中的==实际上是测试等于,所以这应该只是一个单一=。

0

没有凌乱的引用变量。我已经生成了我自己的假设输入数组进行测试。

代码:

$playerSubstitutions=[ 
    ['type'=>'on','time'=>'5'], 
    ['type'=>'off','time'=>'25'], 
    ['type'=>'on','time'=>'38'], 
    ['type'=>'off','time'=>'41'], 
    ['type'=>'on','time'=>'58']]; 
$matchDuration='90'; 

foreach(array_chunk($playerSubstitutions,2) as $set){ // process subbing in pairs 
    $aptPeriods[]=[ 
     'start'=>$set[0]['time'], 
     'end'=>(isset($set[1]['time'])?$set[1]['time']:$matchDuration) 
    ]; 
} 
var_export($aptPeriods); 

输出:

array (
    0 => 
    array (
    'start' => '5', 
    'end' => '25', 
), 
    1 => 
    array (
    'start' => '38', 
    'end' => '41', 
), 
    2 => 
    array (
    'start' => '58', 
    'end' => '90', 
), 
) 

代码#2:

$tally=0; 
foreach($playerSubstitutions as $sub){ 
    if($sub['type']=='on'){ 
     $tally-=$sub['time']; 
    }else{ 
     $tally+=$sub['time']; 
    } 
} 
if($sub['type']!='off'){$tally+=$matchDuration;} // if player finished the match on the field 
echo $tally; 
// output: 55