@Nohaga

Почему так странно ищет substr?

$findstr = ';a:29:{s:4:"name";s:12:"Лоджия";s:4:"type";s:8:"checkbox";s:6:"slider";s:0:"";s:11:"slider_st';
$posnameind=strpos($findstr ,'name');
$posnamevalstart=strpos($findstr ,"\"", $posnameind+6);
$posnamevalend=strpos($findstr ,"\"", $posnamevalstart);    
$namevalue=substr($findstr ,$posnamevalstart+1,$posnamevalend);
print_r($namevalue.'<br/>');

Может мне кто нибудь объяснить почему результат выполнения этого кода равен "Лоджия";s:4:"type".
Не знаю как добыть из этого сеарилзованного JSON нужные значения.
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
@DanKud
Во-первых в этой строке есть кириллица, а значит нужно использовать функции для работы с многобайтовыми строками.

Во-вторых переменные $posnamevalstart и $posnamevalend у вас имеют одинаковые значения. Раз вы ищете в обеих переменных одинаковые значения, то нужно смещать начальную точку:
$posnamevalend = mb_strpos($findstr, "\"", $posnamevalstart + 1);

В-третьих третьим параметром в функции substr() передается ДЛИНА ВОЗВРАЩАЕМОЙ СТРОКИ. Значит нужно написать эту строку следующим образом:
$namevalue = mb_substr($findstr, ($posnamevalstart + 1), ($posnamevalend - $posnamevalstart - 1));

Ну и самое главное - зачем вы вообще это делаете? Если просто понять как работать с strpos() и substr() то окей. А так у вас там обычная сериализованная строка (только почему-то обрезанная вами), которая представляется в массив функцией unserialize()
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
alexey_bille
@alexey_bille
Web developer
1. это не JSON, а сериализованная строка
2. возможно из за мультибайтовой кодировки https://www.php.net/manual/ru/function.mb-substr.php
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Третий аргумент - это не позиция конца подстроки, это длина необходимой подстроки.
$namevalue=substr($findstr, $posnamevalstart + 1, $posnamevalend - $posnamevalstart - 1); // Лоджия
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Что вопрос, что ответы - АД.

Как правильно написали, это PHP serialize, только не целая строка, а какой-то огрызок
Поэтому надо брать оригинаьную строку, и делать так
$array = unserialize($findstr);
echo $array['name'];
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы