在一个foreach迭代中创建键值对,并将值重新分配给另一个

时间:2017-06-12 12:08:26

标签: php arrays 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']肯定是设置的,但空白的结尾&#39;值未被重新分配。我哪里错了?

2 个答案:

答案 0 :(得分:1)

如果要修改原始值,请使用...

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

(注意&amp; in $ period位)

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

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

答案 1 :(得分: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