背景
我试图弄清楚在一场比赛中足球运动员(足球运动员)的实际上场时间。换句话说,他作为现役球员在场上的时间。
提供了一些用户输入的数据:
问题
我试图创建一对事件,代表一个'单位'实际上场时间。在这个例子中,在最外面的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;值未被重新分配。我哪里错了?
答案 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