在数组中查找最后一个非零值

时间:2014-06-25 12:36:17

标签: php mysql arrays

我在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(),';}

4 个答案:

答案 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)));