2014-05-09 76 views
1

我有JSON,看起來像這樣(縮短可讀性):搜索JSON PHP

{ 
    "heroes": [ 
     { 
      "name": "antimage", 
      "id": 1, 
      "localized_name": "Anti-Mage" 
     }, 
     { 
      "name": "axe", 
      "id": 2, 
      "localized_name": "Axe" 
     }, 
     { 
      "name": "bane", 
      "id": 3, 
      "localized_name": "Bane" 
     } 
    ] 
} 

我有一個PHP變量等於三個ID中的一個。我需要搜索JSON的id並返回本地化的名稱。這是我到目前爲止所嘗試的。

$heroid = $myplayer['hero_id']; 

$heroes = file_get_contents("data/heroes.json"); 
$heroesarray = json_decode($heroes, true); 

foreach ($heroesarray as $parsed_key => $parsed_value) { 
     if ($parsed_value['id'] == $heroid) { 
    $heroname = $parsed_value['localized_name']; 
    } 
} 
+2

使用'foreach'循環並遍歷解碼數組。你試過什麼了? –

+0

使用json_decode函數將JSON轉換爲PHP數組。 –

+0

看着你的示例代碼,你陷入了我犯的同樣的錯誤。您還有1個級別的陣列數據可以通過。看到我的答案。在上面的示例中,嘗試將'foreach($ heroesarray')更改爲'foreach($ heroesarray [0]'。我的答案通過另一個循環來實現相同的目標 – JakeGould

回答

1

簡單。只需使用json_decode()即可。解釋在底部的代碼後面。

// First set the ID you want to look for. 
$the_id_you_want = 2; 

// Next set the $json. 
$json = <<<EOT 
{ 
    "heroes": [ 
     { 
      "name": "antimage", 
      "id": 1, 
      "localized_name": "Anti-Mage" 
     }, 
     { 
      "name": "axe", 
      "id": 2, 
      "localized_name": "Axe" 
     }, 
     { 
      "name": "bane", 
      "id": 3, 
      "localized_name": "Bane" 
     } 
    ] 
} 
EOT; 

// Now decode the json & return it as an array with the `true` parameter. 
$decoded = json_decode($json, true); 

// Set to 'TRUE' for testing & seeing what is actually being decoded. 
if (FALSE) { 
    echo '<pre>'; 
    print_r($decoded); 
    echo '</pre>'; 
} 

// Now roll through the decoded json via a foreach loop. 
foreach ($decoded as $decoded_array_key => $decoded_array_value) { 
    // Since this json is an array in another array, we need anothe foreach loop. 
    foreach ($decoded_array_value as $decoded_key => $decoded_value) { 
    // Do a comparison between the `$decoded_value['id']` and $the_id_you_want 
    if ($decoded_value['id'] == $the_id_you_want) { 
     echo $decoded_value['localized_name']; 
    } 
    } 
} 

好吧,我第一次嘗試在這個沒有原因的工作,我也沒有你的,就是你的JSON結構嵌套很深,什麼是預期多了一個層次。請參閱我在​​的調試代碼?這是當一個數組解碼輸出:

Array 
(
    [heroes] => Array 
     (
      [0] => Array 
       (
        [name] => antimage 
        [id] => 1 
        [localized_name] => Anti-Mage 
       ) 

      [1] => Array 
       (
        [name] => axe 
        [id] => 2 
        [localized_name] => Axe 
       ) 

      [2] => Array 
       (
        [name] => bane 
        [id] => 3 
        [localized_name] => Bane 
       ) 

     ) 

) 

首先,你有一個數組開始與可能等同於$decoded[0],然後在下面,你有另一個數組這相當於$decoded[0]['heroes'],然後在出現的數組包含結構爲$decoded[0]['heroes'][0]$decoded[0]['heroes'][1]$decoded[0]['heroes'][2]的值。

但解決這個問題的關鍵是​​,它幫助我看到了JSON的更大結構。

+0

它不適用於我我將使用我的'嘗試 –

+0

@ChrisByatt好吧,現在就試試吧,它應該可以正常工作。 – JakeGould

1

json_decode()需要JSON字符串和(如果第二個參數是true)將其轉換相聯繫的數組。然後我們用foreach來循環這些數據,直到找到你想要的英雄。

$json = ''; // JSON string 
$data = json_decode($json, true); 

foreach($data['heroes'] as $hero) { 
    if($hero['id'] === 2) { 
     var_dump($hero['localized_name']); 
     // Axe 

     // This will stop the loop, if you want to keep going remove this line 
     break; 
    } 
}