我在PHP中构建了一个测试模拟,由于速度问题,我已经重建了它。测试必须在一小时,几小时内完成,然后在该小时内完成。
我创建了一个数组,其中包含每小时包含的项目数。所以:
$arrItemsEachHour(
0=> 0
1=> 0
2=> 0
3=> 0
4=> 0
5=> 0
6=> 0
7=> 0
8=> 1
9=> 2
10=> 4
11=> 5
12=> 6
13=> 7
14=> 7
15=> 8
16=> 8
17=> 8
18=> 7
19=> 6
20=> 5
21=> 4
22=> 4
23=> 1
24=> 0
);
这是每天的相同数组。
我需要在模拟运行后更新数据库。我使用mysql插入查询如下:
$strSql = 'insert into results (id, day, hour, item, won, lost) values (1,2,3,6,2,4),
(1,2,4,7,3,4), (),()......();';
我需要知道模拟结束的地方,所以我可以结束mySql字符串。 $ strSql在for循环之外,其中的值以我上面给出的方式创建和保存。
所以我需要创建一个if语句,当日期等于最后一天(我手边的这个值)以及当前最后一个非零值在for循环中时,它会关闭mysql语句。
这就是我的for循环:
for($i = 1; $i <= $this->intNumberOfDays; $i ++) {
for($n = 0; $n < 24; $n ++) {
for($k = 0; $k <= $arrItemsEachHour [$n]; $k ++) {
}
}
}
我的问题是:
如何决定数组中的最后一个非零值?
答案:
$length = count($arrItemsEachHour) -1;
for($k = $length; $k >= 0; $k --)
{
if($arrItemsEachHour[$k] != 0)
{
// From $arrItemsEachHour[$k + 1] to $arrItemsEachHour[23] there are 0
}
}
如果声明:
if ($i == $this->intNumberOfDays && $intLastHour == $n && $k == $arrItemsEachHour [$n])
{ 'values();'} else {'values(),';}
答案 0 :(得分:5)
从数组末尾开始,循环直到你有一个非零值。第一个非零值在数组中后跟0。
$length = count($arrItemsEachHour) -1;
for($k = $length; $k >= 0; $k --)
{
if($arrItemsEachHour[$k] != 0)
{
// From $arrItemsEachHour[$k + 1] to $arrItemsEachHour[23] there are 0
}
}
发布编辑以符合Jay Blanchard的想法
答案 1 :(得分:3)
这样的东西?删除零值,取最后一个元素并提取密钥。
$arr = array_filter($arrItemsEachHour);
end($arr);
$lastNonZeroKey = key($arr);
var_dump($arrItemsEachHour[$lastNonZeroKey], $lastNonZeroKey);
答案 2 :(得分:1)
我只是首先遍历数组以找到最后一个非零:
$lastKey = -1;
foreach($arrItemsEachHour as $key => $val){
if(!empty($val)){
$lastKey = $key;
}
}
for($n = 0; $n < 24; $n ++) {
for($k = 0; $k <= $arrItemsEachHour [$n]; $k ++) {
if($n == $lastKey){
//Last!
//Do some stuff
break;//Break out the loop
}else{
//Not last
}
}
}
答案 3 :(得分:0)
end(array_diff($ arrItemsEachHour,array(0)));