У меня есть объект Json, который получен в PHP как строка …. не объект — я хочу преобразовать его в массив PHP, теперь я могу создать функцию, которая удаляет строку и удаляет скобки … позиционировать все ключи и значения в их положении … но мне интересно, может быть, есть лучший способ …
Строка json печатается …. вот почему она приходит как строка
<?php
$foo =json_decode('<ion:images/>'); // IonizeCms tag
// $foo[0] will output "{"...and not "cat"....
?>
// {"name":cat,"pic":"cat.png"}{"name":dog,"pic":"dog.png",}
я использую ионизировать Framework — который основан на codeigniter — вот тег, который создает тег images:
public static function tag_images(FTL_Binding $tag)
{
$str = '';
// Model load
self::load_model('page_test_model');
$new_details = self::$ci->page_test_model->get_details();
foreach ($new_details as $image) {
if(is_array($image)){
$str .=json_encode($image, true);
}
}
return json_encode($str, true);
}
Как и просили в комментариях:
var_dump(json_decode('<ion:images/>'));
var_dump(json_last_error_msg());
даст — в представлении (не в исходном коде)
string(104) "{"name":"cat,"pic":"cat.png"}{"name":"dog","pic":"dog.png"}"string(8) "No error"
json_decode
ожидает допустимой строки JSON для ввода. Ваш ввод не является строкой JSON. Ваш ввод — это элемент XML. Когда вы пытаетесь json_decode
что-то, что не является строкой JSON, декодирование не удастся.
$foo = json_decode('<ion:test_images/>');
var_dump($foo); // NULL
var_dump(json_last_error_msg()); // "Syntax error"
Увидеть http://eval.in/905948
Ionize, по-видимому, удаляет тег до json_decode
выполняется, но поскольку вы заключили элемент в одинарные кавычки, json_decode будет просто обрабатывать ввод как строку. Так что вам нужно использовать
$foo = json_decode(<ion:test_images/>);
Однако JSON, созданный из тега, также недопустим:
{"name":cat,"pic":"cat.png"}{"name":dog,"pic":"dog.png",}
должно быть
[{"name":"cat","pic":"cat.png"},{"name":"dog","pic":"dog.png"}]
Поэтому обязательно передайте действительный JSON, например, исправить код, который производит JSON:
public static function tag_images(FTL_Binding $tag)
{
$images = array();
self::load_model('page_test_model');
$new_details = self::$ci->page_test_model->get_details();
foreach ($new_details as $image) {
if (is_array($image)){
$images[] = $image;
}
}
return json_encode($images, true);
}
Ранее вы бы json_encode
изображения в строку, а затем json_encode
эта строка снова. Это, очевидно, не будет производить коллекцию, а просто объединит отдельные объекты или массивы.
как вы можете видеть в документации: http://php.net/manual/en/function.json-decode.php
использовать второй параметр json_decode
$array = json_decode($json_string, true);
<?php
$data='{"name":cat,"pic":"cat.png"}{"name":dog,"pic":"dog.png",}'; //the input string
$data = str_replace(array('{','}',':',','), '',$data); //replacing in order to prepare my explode to convert it into a normal array
$data=explode('"',$data); //first array creation
$data = array_values(array_filter(array_map('trim', $data), 'strlen'));//remove some empty fields that were caused from explode to keep only the values needed and re-arrange array keys
//print_r($data);
$newArray=array();
$arrayKeys=array();
$arrayFields=array();
for($i=0;$i<count($data);$i=$i+2){
$arrayKeys[$i]=$data[$i];
}
for($i=1;$i<count($data);$i=$i+2){
$arrayFields[$i]=$data[$i];
}$arrayKeys = array_values(array_filter(array_map('trim', $arrayKeys), 'strlen'));
$arrayFields = array_values(array_filter(array_map('trim', $arrayFields), 'strlen'));
$counter=0;
//setting up the fields and filling with values (they need to be nested because an array can not have duplicate keys)
for($i=0;$i<count($arrayKeys);$i++){
$newArray[$i]['name']=$arrayFields[$i];
$i++;
$newArray[$i]['pic']=$arrayFields[$i+$counter];
}
//fixing array format
for($i=0;$i<count($newArray);$i=$i+2){
$newArray[$i]=array_merge($newArray[$i],$newArray[$i+1]);
unset($newArray[$i+1]);
}
echo'<pre>';
print_r($newArray);
Это было сложнее, чем я думал, но наконец-то все готово !!! я добавил комментарии в мой код, чтобы это было понятно.
Выход:
Array
(
[0] => Array
(
[name] => cat
[pic] => cat.png
)
[2] => Array
(
[name] => dog
[pic] => dog.png
)
)
Понял … так как строка была искажена, поэтому она не может быть декодирована как JSON, так
этот
{ «Имя»: кошки, «ПИК»: «cat.png»} { «имя»: собака, «ПИК»: «dog.png»,}
должен был выглядеть
{ «Имя»: кошки, «ПИК»: «cat.png»},{«name»: dog, «pic»: «dog.png»} // с запятой между
И результат
<?php
$images_arr =json_decode('<ion:images/>');
$finale_arr=[];
$images_arr = str_replace("}{","}||{",$images_arr);
$images_arr = explode("||",$images_arr);
foreach ($images_arr as $image_arr){
$finale_arr[]=json_decode($image_arr);
}
$array = json_decode(json_encode($finale_arr),
True);
echo '<pre>';
print_r($array);
echo '</pre>';
?>//Outputs
Array
(
[0] => Array
(
[name] => cat
[pic] => cat.png
)
[1] => Array
(
[name] => dog
[pic] => dog.png
)
)