ошибка цикла в коде php - PullRequest
0 голосов
/ 28 апреля 2018

Вот мой код, и он не удаляет элемент $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); 
?>

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Попробуйте использовать дополнительный массив, чтобы выдвинуть правильные значения. Вы вычисляете count($arr); каждую итерацию, а когда вы делаете count($arr);, ваш массив становится меньше, а count($arr); возвращает меньшие значения, поэтому последние элементы не будут сравниваться, попробуйте использовать переменную для вычисления количества перед изменением цикла:

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

Или удалите плохой элемент с помощью дополнительного массива, поместите хорошие элементы в новый массив и не удаляйте их из входного массива:

<?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'
    ];
    $cleared_from_mess_array = array();
    for ($i = 0; $i <= count($arr); $i++) {
        if ($arr[$i]{0} != '#') 
        {           
            array_push($cleared_from_mess_array,$arr[$i]);
        }
    }
    print_r($cleared_from_mess_array);

exit;
0 голосов
/ 28 апреля 2018

больше пространств:

for ($i = 0; $i < count($arr); $i++) {

    if (strpos($arr[$i], '#') !== false) {
     echo "<br/>";
    } else {
        echo $arr[$i]."<br/>";
    }
}
0 голосов
/ 28 апреля 2018

Причина: - Вы рассчитываете длину массива внутри цикла и каждый раз, когда любое значение получает unset() из массива, длина массива уменьшается и значение count($array) изменилось (просто уменьшилось)

Таким образом, логически ваш 5-й и 6-й элемент никогда не проходит через условие if (они никогда не пересекаются циклом из-за уменьшения длины массива)

Решение 1: - Поставьте счетчик снаружи, и он будет работать правильно: -

$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() loop

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

Выход: - https://eval.in/996502

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...