За последние 24 часа нас посетили 20617 программистов и 1107 роботов. Сейчас ищут 368 программистов ...

Заменить подстроку в строке

Тема в разделе "PHP для новичков", создана пользователем pendalf2, 26 апр 2017.

  1. pendalf2

    pendalf2 Новичок

    С нами с:
    26 апр 2017
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте! Помогите заменить подстроку в строке, если выполняются условия.
    (для корзины интернет-магазина).
    Допустим, в корзине уже есть товары, и переменная выглядит так:
    Код (Text):
    1. "10":{"color": 20, "size": 30, "count": 2},"11":{"color": 21, "size": 31, "count": 4},
    При добавлении в корзину товара с ID 10 должно измениться только его количество и результат должен быть таким:
    Код (Text):
    1. "10":{"color": 20, "size": 30, "count": 3},"11":{"color": 21, "size": 31, "count": 4},
    Но что-то в цикле if ($a[$i]==$test) не срабатывает.
    Мучаюсь 2й день, не понимаю где упустил.

    PHP:
    1. $id = intval(10);     //айди товара
    2. $color = intval(20);  //цвет товара
    3. $size = intval(30);   //размер товара
    4. $count = 3;           //количество таких же товаров в корзине
    5.  
    6. //строка, которая сформировалась, решаем добавлять ее (если такого товара еще нет) или нет (если такой товар в корзине уже есть то нужно только изменить количество товаров в этом товаре)
    7. $podstroka = '"'.$id.'":{"color": '.$color.', "size": '.$size.', "count": '.$count.'},';
    8.  
    9. //допустим, это сейчас уже есть в сессии
    10. $sessya = 'xxx"10":{"color": 20, "size": 30, "count": 2},xxx"11":{"color": 21, "size": 31, "count": 4},';
    11.  
    12.  
    13. //просчитываем количество товаров для возможносуществующего такого же товара в корзине
    14. if ($count <= 1) {
    15.     $newcount = 1;
    16. }
    17. else if ($count >  1) {
    18.     $newcount = $count - 1;
    19. }
    20. //--конец просчета
    21.        
    22. //формируем строку для сравнения, есть ли уже такой товар в корзине с количеством минус 1 от текущего счетчика
    23. $test = '"10":{"color": 20, "size": 30, "count": 2},';
    24.  
    25.  
    26. //создаем массив из того, что есть в сессии с разделителем "ххх"
    27. $massiv = explode('xxx', $sessya);
    28.  
    29. foreach ($massiv as $a):
    30. {
    31.     for ($i=1; $i<count($a); $i++)
    32.     {
    33.         if ($a[$i]==$test)
    34.         {
    35.             $a[$i] = $podstroka;
    36.         }
    37.     }
    38.     echo $a;
    39. }
    40. endforeach;
     
  2. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    1) Корзина на сервере считается? Не на клиенте?
    2) Строка очень похожа на JSON, но странный. Быть может имеет смысл использовать реальный валидный JSON и просто десериализовывать его перед обработкой данных и, после обработки, сериализовывать обратно в строку?
     
    pendalf2 нравится это.
  3. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. $massiv = explode('xxx', $sessya);
    2. foreach ($massiv as $a){
    3.     $a = json_decode($a, true);
    4. }
     
    pendalf2 нравится это.
  4. pendalf2

    pendalf2 Новичок

    С нами с:
    26 апр 2017
    Сообщения:
    2
    Симпатии:
    0
    1) на сервере
    2) точно. С каждым новым приходом переменных (т.е. с каждым добавлением товара в корзину) формирую JSON. С ним сталкиваюсь впервые, поэтому он странный, видать не все еще знаю.
    Однако, проблему решил. Подстрока адекватно находится в строке и количество товаров увеличивается на единицу.
    Спасибо.
     
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Не надо ничего искать и менять. Есть функции для работы с JSON на стороне PHP: json_decode и json_encode. Пользуйся ими.