首页 > 解决方案 > php代码中的循环错误

问题描述

这是我的代码,它没有删除$arr[5]元素,所以我试图#从我的数组中删除以开头的字符串

这是代码

<?php
    $arr = [
        '#EXTM3U',
        '#EXTINF:177,Paul Dateh & Oren Yoel - Be More',
        'Be More.mp3',
        '#EXTINF:291,Christopher Toy - Just Because',
        'Just Because.mp3',
        '#EXTINF:238,Magnetic North - Drift Away',
        'Drift Away.mp3'
    ];
    for ($i = 0; $i <= count($arr); $i++) {
        if ($arr[$i]{0} == '#') {
            echo $arr[$i] . "\n";
            unset($arr[$i]);
        }
    }
    print_r($arr); 
?>

标签: phploops

解决方案


原因:-您正在计算循环内的数组长度,并且每次unset()从数组中获取任何值时,数组的长度都会减少并且值会count($array)改变(只是减少)

因此,从逻辑上讲,您的第 5 和第 6 个元素永远不会通过if条件(由于数组长度的减少,它们永远不会被循环遍历)

解决方案 1:-将 count 放在外面,它会正常工作:-

$count = count($arr);

//loop start from 0 so use < only otherwise, sometime you will get an undefined index error

    for ($i = 0; $i < $count; $i++) { 
        if ($arr[$i]{0} == '#') {
            //echo $arr[$i] . "\n";
            unset($arr[$i]);
        }
    }
    print_r($arr);

输出:- https://eval.in/996494

解决方案2:-这就是为什么我更foreach()喜欢for()循环

 foreach($arr as $key=> $ar){
        if ($ar[0] == '#') {
            unset($arr[$key]);
        }
    }
    print_r($arr); 

输出:- https://eval.in/996502


推荐阅读