2014-12-12 17 views
0

storage.json:PHP JSON чтения файла

{"544aee0b0a00f":{"p_name":"testname","p_about":null,"file":"images\/1.png"}} 
{"548afbeb42afe":{"p_name":"testname2","p_about":null,"file":"images\/2.png"}} 
{"549afc8c8890f":{"p_name":"testname3","p_about":null,"file":"images\/3.jpg"}} 

Теперь цифры с буквами в начале являются uniqid() функция, которая была вызвана, когда написание элементов в файл.

<?php 
$storage_file = 'storage.json'; 
$storage = file_get_contents($storage_file); 
$storage = json_decode($storage,true); 
$storage = empty($storage) ? array() : $storage; 
print_r($storage) 
?> 

Теперь я попытался отобразить все записи из файла JSON, но он работает только если у меня есть 1 запись в файл, если у меня есть более чем 1, для, как здесь о (3 записи), чем результат я get is simple text: Array()

Может ли кто-нибудь помочь мне? Я как бы застрял здесь, не знаю, что делать, чтобы исправить проблему.

+4

У вас есть недопустимый JSON. Неудивительно, что это дает вам неприятности. : P – cHao

+6

Если у вас несколько объектов JSON, они должны быть сгруппированы в массив JSON. Что-то вроде '[{...}, {...}, {...}]'.Ваш 'storage.json' на самом деле не является допустимым файлом JSON. Ваша проблема исходит из кода, который «пишет элементы в файл» (почему вы не используете базу данных?) – sjagr

+0

это, его просто [] был заменен $ new_id = count ($ storage); $ uid = uniqid(); $ storage [$ uid] = $ new_record; file_put_contents ($ storage_file, json_encode ($ storage), FILE_APPEND); – EvilNabster

ответ

4

Если вы попытаетесь декодировать все сразу, это приведет к сбою из-за недопустимого JSON, потому что вам нужен массив для хранения нескольких объектов.

Вместо этого вам нужно декодировать каждую строку один на один:

<?php 
$storage_file = 'storage.json'; 
$storage = file_get_contents($storage_file); 
$lines = explode("\n", $storage); 

for ($i=0;$i<count($lines);$i++) 
{ 
    $data = json_decode($lines[$i],true); 
    print_r($data); 
} 

?> 

<?php 
$storage_file = 'storage.json'; 
$storage = file_get_contents($storage_file); 
$lines = explode("\n", $storage); 

foreach ($lines as $line) 
{ 
    $data = json_decode($line,true); 
    print_r($data); 
} 

?> 

<?php 
$storage_file = 'storage.json'; 
$storage = file_get_contents($storage_file); 
$lines = explode("\n", $storage); 

foreach ($lines as $line) 
{ 
    $data = json_decode($line, true); 
    foreach ($data as $key => $value) { 
     echo "p_name = ".$data[$key]["p_name"]."\n"; 
    } 
} 

?> 
+0

возможно использовать foreach, а не в этом случае. – Alex

+0

@Alex Я согласен, 'foreach' всегда читаем, я включил ваш sugestion – meda

+0

Глупый вопрос, теперь он показывает все и т. Д. И т. Д., Как я могу назвать результаты, но имена? например, вместо того, чтобы отображать 'Array ([0] => Array ([p_name] => about [p_about] => [file] => images/1.png) [1] => Array ([p_name] = > abobo [p_about] => [file] => images/2.png) ' Я хочу показать только имя и файл, как это сделать? – EvilNabster

0

Как МЕДА упоминалось выше код работает прекрасно, а я буду использовать foreach

$storage_file = 'storage.json'; 
$storage = file_get_contents($storage_file); 
$lines = explode("\n", $storage); 

foreach ($lines as $str){ 
    $data = json_decode($str,true); 
    print_r($data); 
} 
+0

Или вы могли бы просто предложите редактировать. – sjagr

0

поздно, но надеюсь, что этот ответ будет полезен кому-то.

У вас есть действующий json в каждой строке файла.
Так лучшее решение использовать file():

$data = array_map(function($row){ 
    return json_decode($row); 
}, file('storage.json')); 

print_r($data); 
  • file дают нам массив строк файла (так, нам не нужно, чтобы взорвать его)
  • array_map относится json_decode к каждой строке

Для получения pname только:

$data = array_map(function($row){ 
    $a = json_decode($row); 
    return $a[key($a)]['pname']; 
}, file('storage.json')); 

print_r($data); 

Добавить
Вы можете использовать этот код для создания файла:

$new_id = count($storage); 
$uid = uniqid(); 
$storage[$uid] = $new_record; 
file_put_contents($storage_file,json_encode($storage), FILE_APPEND); 

Но гораздо лучше использовать это:

//get current database: 
$data = json_decode(file_get_contents($filename), true); 
//... 
$uid = uniqid(); 
$data[$uid] = $new_record; 
file_put_contents($filename, json_encode($storage)); 

Таким образом, мы всегда имеем действительный JSON со всеми данными.
И всегда может получить его просто:

//get current database: 
$data = json_decode(file_get_contents($filename), true); 
Смежные вопросы