2016-06-29 4 views
0

JsonPhp JSON декодирования с несколькими объектами

{ 
    "articles": [ 
     { 
      "id": 1, 
      "name": "Josh" 
     }, 
     { 
      "id": 2, 
      "name": "Jenny" 
     }, 
     { 
      "id": 3, 
      "name": "Chris" 
     } 
    ] 
} 

Как искать имена по идентификатору?
Что делать, если я хочу выбрать только Джоша?

Теперь я декодирую json с помощью php и foreach loop.

$url = "articles.json"; 
$json = json_decode(file_get_contents($url)); 
foreach($json->articles as $articles){ 
    echo $articles->name; 
} 

Я хочу, чтобы выбрать только это имя, где идентификатор 1.

+0

Вы должны были бы сделать forloop. Если вы хотите выполнить поиск по определенному запросу, вам нужно будет использовать фреймворк, например jql, jsonpath или более крупную структуру, в которой есть запрос json внутри. –

ответ

1
$url = "articles.json"; 
    $json = json_decode(file_get_contents($url)); 
    foreach($json->articles as $articles){ 
     if($articles->id==1){ 
      echo "found id equal to 1"; 
    } 
     if($articles->name=="Josh"){ 
      echo "found Josh"; 
    } 
    } 

Даже лучше, как небольшая функция для fieldValue (id или name) с url, checkValue в качестве дополнительных параметров

Function loopThruJSON ($json,$fieldValue,$checkValue) { 
     $json = json_decode($json); 
     foreach($json->articles as $articles){ 
      if($articles->{$fieldValue}==$checkValue){ 
       return "found ".$fieldValue." equal to ".$checkValue; 
      } else { 
       return false; 
      } 
     } 
    } 

На основе FirstOne's комментария + пример выше можно написать

Function loopThruJSON ($json,$fieldValue,$checkValue) { 
      $json = json_decode($json); 
      foreach($json->articles as $articles){ 
       if($articles->$fieldValue==$checkValue){ 
        return "found ".$fieldValue." equal to ".$checkValue; 
       } else { 
        return false; 
       } 
      } 
    } 
// Usage 
echo loopThruJSONID ("articles.json",'id',1) ; 
echo loopThruJSONName ("articles.json",'name',"Josh") ; 

PHP sandbox example, 3v4l example

+0

Это не будет работать (функциональная часть) ... к тому времени, как вы вызываете функцию, нет '$ articles-> id' ... – FirstOne

+0

Что-то вроде этого, может быть: [https://3v4l.org /UqE8n](https://3v4l.org/UqE8n) – FirstOne

+0

@FirstOne вы правы, что на земле я пишу :) один момент –

3
$json = '{ 
    "articles": [ 
     { 
      "id": 1, 
      "name": "Josh" 
     }, 
     { 
      "id": 2, 
      "name": "Jenny" 
     }, 
     { 
      "id": 3, 
      "name": "Chris" 
     } 
    ] 
}'; 

$json = json_decode($json); 
$id = '1'; 
$result = 'NOT FOUND'; 
foreach($json->articles as $articles){ 
    if($articles->id == $id){ 
     $result = $articles; 
    } 
} 

print_r($result); 

выход:

StdClass Object ([ID] => 1 [имя] => Josh)

Таким образом, вы храните как id, так и name.

Access это нормально, вот так: echo $result->name;

1

Это довольно просто:

function findById($articles, $id){ 
    foreach($articles as $article){ 
     if($article['id'] === $id) 
      return $article; 
    } 
} 

В этом ответе, вам нужно будет пройти true в качестве второго параметра json_decode(), чтобы преобразовать данные в ассоциативные массивы.

$json = json_decode(file_get_contents($url), true); 
+0

_type 8 - Неопределенная переменная: article_. У вас неправильный порядок, D ... – FirstOne

+0

oops, я был вдали от php на некоторое время lol – meda

+0

Замечание, которое вы вызываете, также используйте его как объект (без 'true' в json_decode), изменив '$ article ['id']' to '$ article-> id'. – FirstOne

2

Вы можете использовать array_filter, чтобы каждый элемент в массиве с идентификатором вы хотите.

$id = 1; // define your id 

// filter for that id 
$results = array_filter($json->articles, function($x) use ($id) { 
    return $x->id == $id; 
}); 

Результатом будет массив с нулевым или большим количеством элементов, в зависимости от того, сколько раз идентификатор найден. Я не уверен, что вам нужно делать с результатами, но вы можете цикл над ними Еогеасп или доступ к конкретным элементам по ключу, как это:

echo $results[0]->name; // echo the name of the first match 
Смежные вопросы