#php #json
#php #json
Вопрос:
Моя цель — создать массив объектов (статья), мне удается восстановить pmid, doi and title
, но когда дело доходит до массива location
, я не смог этого сделать, это код, который я пробовал:
<?php
class Article
{
private $pmid;
private $doi;
private $title;
private $location=array();
public function setLocations($tabLocations){
foreach ($tabLocations as $key => $value) {
$location[]=$value;
}
}
public function setPmid($_pmid){
$this->pmid=$_pmid;
}
public function setDoi($_doi){
$this->doi=$_doi;
}
public function setTitle($_title){
$this->title=$_title;
}
//getters
public function getTitle(){
return $this->title;
}
}
//get pmid from DOM
require_once "simple_html_dom.php";
$html=new simple_html_dom();
$html->load_file('http://brainspell.org/search?query=psen 1');
$pmid=array();
foreach ($html->find('.paper-stuff') as $article) {
$pmid[]= str_replace("/article/","",$article->find('a',0)->getAttribute('href'));
}
//Create ALLArticles TAb
$articlesTab=array();
//upload data file
$json=file_get_contents("C:wampwwwprojet1jsonallArticles.json");
$data=json_decode($json,true);
foreach ($pmid as $tabPmid) {
foreach ($data as $key=>$value) {
if($value["pmid"]==$tabPmid)
{
$details=new Article();
$details->setPmid($value["pmid"]);
$details->setDoi($value["doi"]);
$details->setTitle($value["title"]);
$details->setLocations($value['experiment']['location']);
$articlesTab[]=$details;
}
}
}
?>
Это часть моего кода JSON:
{
"papers": {
"paper": [
{
"pmid": "6330179",
"doi": "10.1002/cne.902260203",
"experiment": [
{
"id": "12789",
"location": [
"-46.0,-80.0,2.0",
"-42.0,-76.0,-2.0",
"44.0,-72.0,-2.0",
"52.0,-68.0,-6.0",
"-32.0,-88.0,4.0",
"-32.0,-90.0,8.0",
"34.0,-82.0,8.0",
"34.0,-78.0,8.0",
"-30.0,-52.0,-12.0",
"-30.0,-52.0,-10.0",
"28.0,-66.0,-16.0",
"26.0,-66.0,-12.0",
"-46.0,-76.0,6.0",
"-46.0,-78.0,0.0",
"46.0,-70.0,4.0",
"48.0,-74.0,0.0"
]
}
]
},
{
"pmid": "10022492",
"doi": "10.1093/cercor/9.1.20",
"experiment": [
{
"id": "258",
"location": [
"-42.0,26.0,20.0",
"-36.0,30.0,16.0",
"-30.0,32.0,0.0",
"-28.0,14.0,48.0",
"-20.0,8.0,56.0",
"-32.0,4.0,52.0",
"50.0,10.0,36.0",
"48.0,24.0,20.0",
"32.0,0.0,56.0",
"8.0,-2.0,64.0",
"4.0,-8.0,68.0",
"-16.0,-4.0,12.0",
"-2.0,-18.0,12.0",
"-8.0,2.0,8.0",
"-44.0,-28.0,32.0",
"-4.0,-60.0,60.0",
"36.0,-58.0,52.0"
]
},
Если есть кто-нибудь, кто мог бы мне помочь.Заранее спасибо: D
Ответ №1:
Если вы заметили, что location — это другой массив, поэтому, чтобы получить все его элементы, его необходимо взломать. итак, попробуйте что-то вроде этого.
$details->setLocations(implode(",",$value['experiment']['location']));
Это выведет массив в виде строки, разделенной запятой; возможно, вы можете выбрать то, что хотите в качестве разделителя.
Комментарии:
1. Таким образом, вы не сможете установить массив в качестве аргумента setLocations(), за исключением того, что вы предварительно настроили его на получение массива.
Ответ №2:
Вы просто пропустили $this
ссылку на свойство вашего объекта в setLocations
public function setLocations($tabLocations){
foreach ($tabLocations as $key => $value) {
$this->location[]=$value; // $this->location is where you want to store your locations
}
}
и, кстати, я не вижу необходимости перебирать $tabLocations в вашем сеттере. Не было бы
public function setLocations($tabLocations){
$this->locations = $tabLocations;
}
тоже проделать трюк?
Или, если вы хотите избавиться от ключей:
public function setLocations($tabLocations){
$this->locations = array_values($tabLocations);
}