Как я могу декодировать весь файл arround 10k без ограничения памяти php? я нашел код, который разбил фид на части: http://pastebin.com/m43c3384f
как изменить код для работы с фидом ниже:
GAF_update_projects_vertical_callback({"projects":{"count":2,"items":[{"id":502817,"name":"SEO","url":"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fprojects%2FSEO%2FSEO.502817.html","start_unixtime":1252386582,"start_date":"Tue, 08 Sep 2009 01:09:42 -0400","end_unixtime":1252818582,"end_date":"Sun, 13 Sep 2009 01:09:42 -0400","buyer":{"url":"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fusers%2F1094422.html","id":1094422,"username":"eyalbiber"},"state":"A","short_descr":"Hi, My name is Eyal. I'm looking for seo expert to work with him on long term relationship. I need...","options":{"featured":0,"nonpublic":0,"trial":0,"fulltime":0,"for_gold_members":0,"hidden_bids":0},"budget":{"min":30,"max":250},"jobs":["SEO"],"bid_stats":{"count":0,"avg":false}},{"id":503874,"name":"websubmissionarticles","url":"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fprojects%2FCopywriting%2Fwebsubmissionarticles.html","start_unixtime":1252386528,"start_date":"Tue, 08 Sep 2009 01:08:48 -0400","end_unixtime":1252559328,"end_date":"Thu, 10 Sep 2009 01:08:48 -0400","buyer":{"url":"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fusers%2F39628.html","id":39628,"username":"seexpert"},"state":"A","short_descr":"need some1 to rewrite articles by taking them from the net from various min 5 sources. he\/she can draft...","options":{"featured":0,"nonpublic":0,"trial":0,"fulltime":0,"for_gold_members":0,"hidden_bids":0},"budget":{"min":30,"max":250},"jobs":["Copywriting"],"bid_stats":{"count":0,"avg":false}}]}})
Я пробовал этот код ниже:
<?php require("JSON.php"); $mochi_url = "http://api.getafreelancer.com/Project/Search.json?aff=480992&callback=GAF_update_projects_vertical_callback&order=submitdate&count=50&iads=true&nonpublic=0&charset=UTF-8"; $feed = file_get_contents($mochi_url); $feed_start=strpos($feed,"[{"); $feed = substr($feed,$feed_start+1); $feed = substr($feed,0,strlen($feed)-2); $games = explode("{\"id\": \"",$feed); unset($feed); for($x=1;$x<=count($games);$x++){ $games[$x] = "{\"name\": \"".$games[$x]; $games[$x] = substr($games[$x],0,strlen($games[$x])-2); $games_decode = json_decode($games[$x], true); foreach($games_decode as $varname => $varvalue) { $mochi[$varname] = $varvalue; } $name = $mochi['name']; echo "$x - Name: {$mochi['name']} <br>"; unset ($games[$x]); } ?>
с<?php require("JSON.php"); $mochi_url = "http://api.getafreelancer.com/Project/Search.json?aff=480992&callback=GAF_update_projects_vertical_callback&order=submitdate&count=50&iads=true&nonpublic=0&charset=UTF-8"; $feed = file_get_contents($mochi_url); $feed_start=strpos($feed,"[{"); $feed = substr($feed,$feed_start+1); $feed = substr($feed,0,strlen($feed)-2); $games = explode("{\"id\": \"",$feed); unset($feed); for($x=1;$x<=count($games);$x++){ $games[$x] = "{\"name\": \"".$games[$x]; $games[$x] = substr($games[$x],0,strlen($games[$x])-2); $games_decode = json_decode($games[$x], true); foreach($games_decode as $varname => $varvalue) { $mochi[$varname] = $varvalue; } $name = $mochi['name']; echo "$x - Name: {$mochi['name']} <br>"; unset ($games[$x]); } ?>
он возвращает меня
Предупреждение: неверный аргумент, предоставленный foreach () в /home/studiox/public_html/getafreelancer/auto.php в строке 18 1 – Имя:
Есть идеи?
Прежде всего, избегайте вашей строки json. Как это:
$json_string = "{\"projects\":{\"count\":2,\"items\":[{\"id\":502817,\"name\":\"SEO\",\"url\":\"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fprojects%2FSEO%2FSEO.502817.html\",\"start_unixtime\":1252386582,\"start_date\":\"Tue, 08 Sep 2009 01:09:42 -0400\",\"end_unixtime\":1252818582,\"end_date\":\"Sun, 13 Sep 2009 01:09:42 -0400\",\"buyer\":{\"url\":\"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fusers%2F1094422.html\",\"id\":1094422,\"username\":\"eyalbiber\"},\"state\":\"A\",\"short_descr\":\"Hi, My name is Eyal. I'm looking for seo expert to work with him on long term relationship. I need...\",\"options\":{\"featured\":0,\"nonpublic\":0,\"trial\":0,\"fulltime\":0,\"for_gold_members\":0,\"hidden_bids\":0},\"budget\":{\"min\":30,\"max\":250},\"jobs\":[\"SEO\"],\"bid_stats\":{\"count\":0,\"avg\":false}},{\"id\":503874,\"name\":\"websubmissionarticles\",\"url\":\"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fprojects%2FCopywriting%2Fwebsubmissionarticles.html\",\"start_unixtime\":1252386528,\"start_date\":\"Tue, 08 Sep 2009 01:08:48 -0400\",\"end_unixtime\":1252559328,\"end_date\":\"Thu, 10 Sep 2009 01:08:48 -0400\",\"buyer\":{\"url\":\"http:\/\/www.getafreelancer.com\/affiliates\/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fusers%2F39628.html\",\"id\":39628,\"username\":\"seexpert\"},\"state\":\"A\",\"short_descr\":\"need some1 to rewrite articles by taking them from the net from various min 5 sources. he\/she can draft...\",\"options\":{\"featured\":0,\"nonpublic\":0,\"trial\":0,\"fulltime\":0,\"for_gold_members\":0,\"hidden_bids\":0},\"budget\":{\"min\":30,\"max\":250},\"jobs\":[\"Copywriting\"],\"bid_stats\":{\"count\":0,\"avg\":false}}]}}";
PHP имеет встроенную поддержку JSON. Вы можете декодировать строку JSON непосредственно в ассоциативном массиве PHP, используя json_decode ():
$result = json_decode($json_string, true);
Тестирование:
echo $result['projects']['items'][0]['name']; echo '<br>'; echo $result['projects']['items'][0]['url'];
Результат:
SEO http://www.getafreelancer.com/affiliates/ref.php?u=boon86&l=http%3A%2F%2Fwww.getafreelancer.com%2Fprojects%2FSEO%2FSEO.502817.html
ОБНОВИТЬ:
Ответ на вопрос : что делать, если у меня много проектов внутри канала JSON, и я хочу, чтобы каждый из них хранился в mysql.
Это действительно не связано с JSON, а скорее с массивами PHP. В PHP есть много удобных функций, которые вы можете использовать. В этом случае вам нужно знать количество элементов массива для ваших проектов (чтение: количество проектов), а затем извлечь все данные из вашего массива, используя простой цикл.
for($i = 0; $i < count($result['projects']['items']); $i++) { $project_name = $result['projects']['items'][$i]['name']; $project_id = $result['projects']['items'][$i]['id']; $project_date = $result['projects']['items'][$i]['start_date']; // save / print / do whatever you want with this data echo "Project : $project_name [$project_id] - $project_date<br>"; }
PS Хороший PHP-массив шаг за шагом учебник здесь .
Если у вас просто не хватает памяти, попробуйте изменить параметр memory_limit
в php.ini
на нечто большее, чем значение по умолчанию (по умолчанию может быть 8 МБ, но я не уверен).
На странице увеличения страницы памяти PHP на drupal.org есть примеры других способов увеличить ограничение памяти.