在程序开发中会遇到操作项权限的判断,在比较判断中使用了 Array_splice 函数,意思是想把不符合条件的对象从当前数组中去除掉。但是并没有达到预期的效果。查了下资料后,网上细谈两者共同使用的问题却没有都是些个体函数功能说明。现整理发现,以供以后参考。
这是最初的程序【精简了一下】:
$arrResult = array(); // 总操作列表 $arrOperation = array( array(1," 操作 -1"), array(2," 操作 -2"), array(2," 操作 -3"), array(3," 操作 -4"), array(4," 操作 -5"), array(5," 操作 -6"), array(6," 操作 -7"), array(7," 操作 -8") ); // 条件 [ 设备 ] 范围 $arrCond = array(2,3,4,7,8,9,10); //for($k = 0; $k < count($arrCond); $k++) foreach($arrCond as $k=>$iId) { $temp = array(); // 判断各自对应的操作项 foreach ($arrOperation as $oOpt) { // 如果满足条件,记录到临时变量 if($iId == $oOpt[0]) { $temp[] = $oOpt; } } // 如果没有可用操作项,去除条件数据项值 if(count($temp) < 1){ //unset($arrCond[$k]); array_splice($arrCond,$k,1); $k--; // 退出本次循环 continue; } $arrResult[$iId] = $temp; } // 输出 print_r($arrResult); echo "<br>"; print_r($arrCond); |
运行上面的程序,发现结果是错误的, 经分析原因有两个方面:
1, foreach 循环
foreach 循环中使用了 $k 键值赋值方式,下面在删除当前值后,试图修改其键值 $k ,但这是不允许,至于为什么?在网上在没找到具体的资料,应该是 PHP 不提供修改吧!
这就导致了,当前 $k 键值没有改变,想想看,在下一次做去除时会发生什么?这也是上面程序运行结果错误的原因之一了。
2, array_splice 函数
PHP 手册:
array_splice -- 把数组中的一部分去掉并用其它值取代
1 说明
array array_splice ( array &input, int offset [, int length [, array replacement]] )
array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。 注意 input 中的数字键名不被保留。
该函数的功能是移出数组中的一部分值,或者用其他值取代。在最后他 / 它有个“注意”【数字键名不被保留 】。 OMG… 在我们使用 foreach 循环时,本身键值又不可以修改,两者如果这样搭配运用,不做噩梦才怪!
好了问题发现了,但是要怎么解决呢?目前,我只找到两个方法,第一个很简单使用 for 循环替换第一个 foreach 循环。(唉,真叹服 PHP 的语言功能,不会给人以‘既生瑜何生亮’的感觉)。还有一种方法就是 使用 unset 替换 array_splice 方法,真简单,一个简单的 unset 就轻松的搞定了。哈哈!
两种解决方式(分别用蓝色和梅红色标出了)我都写在了以上程序中了,放开每一处的注释就是 OK 了!!