foreach和array_splice的窘迫

在程序开发中会遇到操作项权限的判断,在比较判断中使用了 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 了!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值