За последние 24 часа нас посетили 22642 программиста и 1218 роботов. Сейчас ищут 638 программистов ...

Это интересно. Удаления символа в строке, или танки лабиринтов не боятся

Тема в разделе "Прочие вопросы по PHP", создана пользователем Luka, 29 май 2017.

  1. Luka

    Luka Новичок

    С нами с:
    10 май 2017
    Сообщения:
    8
    Симпатии:
    1
    Задание: дана строка Mihail. Необходимо вывести ее, а также вывести Miha из нее.
    Используя функции работы со строками, и циклы
    Собственно весь процесс и вопрос находятся ниже в виде кода. Подскажите пожалуйста.
    PHP:
    1. <?php
    2. /*Задание: дана строка Mihail. Необходимо вывести ее, а также вывести
    3. Miha из нее. Используя функции работы со строками, и циклы*/
    4. echo "вариант 1 <br /><br />";
    5.     $str = "Mihail";
    6.     echo $str."<br />";
    7.     echo substr($str, 0, 4)."<br />";
    8.     unset($str);
    9.     $y= (int) strlen($str); //проверяем удалилась ли строка.
    10.    
    11.     echo $y." Если ноль, то строка удалилась <br /><br />";
    12. unset($y);
    13. echo "вариант 2 через цикл While <br /><br />";
    14.     $str = "Mihail";
    15.     $i=0;
    16.     $y= strlen($str);
    17.     While ($i<$y){
    18.         if($i == 4){ //проверяем, у нас Miha это 4 символа, от 0 до 3. и выводим циклом.
    19.             break;
    20.         }
    21.         echo $str{$i};
    22.         $i++;
    23.     }
    24. unset($str);
    25.     $z= (int) strlen($str); //проверяем удалилась ли строка.
    26.  
    27. echo "<br />". $z." Если ноль, то строка удалилась <br /><br />";
    28. unset($z);
    29. echo 'вариант 3 через цикл While, но, работаем с элементами массива.
    30. <br /> Допустим мы знаем что нам надо вывести все символы до второго i,
    31. <br /> но у нас уже есть одно i, поэтому,
    32. мы не можем поставить условие if($str{$i}==i) break;  <br /><br />';
    33. //Выходим из ситуации через символ а
    34.     $str = "Mihail";
    35.     $i=0;
    36.     $y= strlen($str);
    37.     While ($i<$y){
    38.         if($str{$i} == "a"){ //проверяем, равен ли элемент массива и а;
    39.             break;
    40.         }
    41.         echo $str{$i};
    42.         $i++;
    43.     }
    44.     echo " <br />Но тогда выводится Mih, без а,
    45. <br /> как вариант, мы можем, его окнечно прибавить,
    46. <br /> но это немного не то. Идеально было бы проверить на i, но нельзя
    47. <br /> вместо этого попробуем проверить на l <br /><br />";
    48. unset($str);
    49. $str = "Mihail";
    50.     $i=0;
    51.     $y= strlen($str);
    52.     $x=$y-2;
    53.     $rts = "";
    54.     While ($i<$y){
    55.         if($str{$i} == "l"){ //проверяем, равен ли элемент массива и l;
    56.             break;
    57.         }
    58.         $rts{$i} = $str{$i} ;
    59.        $i++;
    60.     }
    61. echo $rts."<br />"; // выводит на один символ больше
    62. unset($rts{$x});
    63. echo $rts; // Выводит как надо
    64. echo " <br />и вот тут выводит, как Array. Почему??
    65. Знаю, как удалить через substr, но вот заморочился,
    66. и интересен этот, третий вариант. <br /><br />";
    67. ?>
    вот какой результат получил
    вариант 1

    Mihail
    Miha
    0 Если ноль, то строка удалилась

    вариант 2 через цикл While

    Miha
    0 Если ноль, то строка удалилась

    вариант 3 через цикл While, но, работаем с элементами массива.
    Допустим мы знаем что нам надо вывести все символы до второго i,
    но у нас уже есть одно i, поэтому, мы не можем поставить условие if($str{$i}==i) break;

    Mih
    Но тогда выводится Mih, без а,
    как вариант, мы можем, его окнечно прибавить,
    но это немного не то. Идеально было бы проверить на i, но нельзя
    вместо этого попробуем проверить на l

    Array
    Array
    и вот тут выводит, как Array. Почему?? Знаю, как удалить через substr, но вот заморочился, и интересен этот, третий вариант.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Какой-то сюр...
    $rts выводит как Array, потому что это....массив. Массив автоматом не преобразуется в строку. Строка в PHP - это поток байтов. Массив - хэшмапа. Тут не Си, где это одно и то же. То, что в строке можно обращаться к конкретному байту (именно байту, а не символу, заметь), не значит, что она работает так же, как и пыховый массив.

    Не надо выводить строки в циклах. Плохая это затея. И по производительности днище. А потом окажется, что существуют мультибайтовые кодировки и все, приехали.
     
  3. Luka

    Luka Новичок

    С нами с:
    10 май 2017
    Сообщения:
    8
    Симпатии:
    1
    Да вот я уже понял, что пытаюсь работать со строкой, как с массивом. Но, я же объявил $rts=""; как пустую строку, почему он в массив перешел?

    но вот вопрос если можно писать
    $rts = $str{1};
    добавляя в строку значение, то почему нельзя писать
    $rts{1} = $str{1};
    а в моем случае тупо по счетчику.
     
  4. Luka

    Luka Новичок

    С нами с:
    10 май 2017
    Сообщения:
    8
    Симпатии:
    1
    Но, ели написать $rts = $rts . $str{$i} ;
    то все работает.
    Получается, если я делаю операцию удаления , то работаю с массивом?
    А так строка?
    Правильный вывод?


    а дальше с $rts все равно удалять последний символ не через unset, а через $rts = substr($rts,0,-1);
    --- Добавлено ---
    Вот и вывел))) но путь был тернист.)
    PHP:
    1. $str = "Mihail";
    2.     $i=0;
    3.     $y= strlen($str);
    4.     $x=$y-2;
    5.     $rts = "";
    6.     While ($i<$y){
    7.         if($str{$i} == "l"){ //проверяем, равен ли элемент массива и l;
    8.             break;
    9.         }
    10.         $rts = $rts .",". $str{$i} ;
    11.        $i++;
    12.     }
    13. $arr = explode(",", $rts);
    14. unset($arr[0]);
    15. unset($arr[5]);
    16. $rts = implode('',$arr);
    17. echo $rts."   вот и вывели)))))";
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Потому что динамическая типизация. Начал работать с ним как с массивом сходу. Изначально переменная была пустая. Пых не долго думая привел ее к массиву.
    --- Добавлено ---
    Я не знаю, зачем вы это делаете, но делать так в реальной жизни не надо.
     
  6. Luka

    Luka Новичок

    С нами с:
    10 май 2017
    Сообщения:
    8
    Симпатии:
    1
    Я знаю) надо, как в первом варианте, даже через mb_substr лучше, просто ковыряюсь для опыта. Что и как работает. Ну интересно мне.)
    А вот ради интереса, вот так же можно использовать конкатенацию $rts=$rts.",".$str{$i};? или тоже в реальной жизни не применимо?
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Правильно.
    Да, можно. А еще эту запись можно сократить до $rts .= "," . $str{$i};

    и да, а почему обращение к массиву такое..кхм..нестандартное? Чем квадратные скобки не угодили?