2014-04-04 56 views
3

我有這個json下面。我試圖使用json_decode獲取值。我得到了一些值,但是我在深度嵌套值方面遇到了問題。這裏是JSON:PHP:嵌套json和值提取

{ 
"startAt": 0, 
"issue": [ 
{ 
    "id": "51526", 
    "fields": { 
     "people": [ 
      { 
       "name": "bob", 
       "emailAddress": "[email protected]", 
       "displayName": "Bob Smith", 
      }, 
      { 
       "name": "john", 
       "emailAddress": "[email protected]", 
       "displayName": "John Smith", 
      } 
     ], 
     "skill": { 
      "name": "artist", 
      "id": "1" 
     } 
    } 
}, 
{ 
    "id": "2005", 
    "fields": { 
     "people": [ 
      { 
       "name": "jake", 
       "emailAddress": "[email protected]", 
       "displayName": "Jake Smith", 
      }, 
      { 
       "name": "frank", 
       "emailAddress": "[email protected]", 
       "displayName": "Frank Smith", 
      } 
     ], 
     "skill": { 
      "name": "writer", 
      "id": "2" 
     } 
    } 
} 
] 

} 

我知道我可以通過這樣得到一個值:

foreach ($decoded_array['issue'][0]['fields']['people'] as $person) { 
    echo $person['emailAddress']; 
} 

然而,有一個簡單的辦法讓所有的「emailAddresses」鮑勃,約翰,傑克,坦率地說?

謝謝!

回答

2

最簡單的方法實際上只是循環,但首先在$decoded_array['issue']上嵌套循環,然後在['people']上嵌套循環。將你的地址收集到一個輸出數組中。

// Note: this assumes you called json_decode() with the second 
// param TRUE to force an associative array.. 
// $decoded_array = json_decode($input_json, TRUE); 

$addresses = array(); 
foreach ($decoded_array['issue'] as $i) { 
    foreach ($i['fields']['people'] as $person) { 
    // Append the address onto an output array 
    $addresses[] = $person['emailAddress']; 
    } 
} 
// De-dupe them if necessary 
$addresses = array_unique($addresses); 
print_r($addresses); 

// Prints 
Array 
(
    [0] => [email protected] 
    [1] => [email protected] 
    [2] => [email protected] 
    [3] => [email protected] 
) 

如果你沒有一定的不同之處在於按鍵被命名爲emailAddress是使用array_walk_recurisve()遍歷數組,尋找該鍵的結構稍微票友方法。這將收集所有密鑰,名爲emailAddress,而不僅僅是['people']子陣列中的那些密鑰。

$addresses = array(); 
// Pass $addresses into the closure by reference so you can write to it 
array_walk_recursive($decoded_array, function($value, $key) use (&$addresses) { 
    // Find *all keys* called emailAddress 
    if ($key == 'emailAddress') { 
    $addresses[] = $value; 
    } 
}); 
0

嘗試:

function people($peopleArray, $searchProperty, $forValueArray){ 
    $fva = array_map('strtolower', $forValuArray); 
    foreach($peopleArray as $v){ 
    $sp = $v[$searchProperty]; $sl = strtolower($sp); 
    if(in_array($sl, $fva)){ 
     $q[] = $sp; 
    } 
    } 
    return isset($q) ? $q : 0; 
} 
if($ans = people($decoded_array, 'emailAddress', array('bob', 'john', 'jake', 'frank'))){ 
    print_r($ans); 
} 
else{ 
    echo 'no results found'; 
} 
0

腳本:

$json = "......"           //Your json text. 
$decoded_array = json_decode($json)->{'issue'};   //Decode Json string 
foreach($decoded_array as $issue){      //Get all Issues 
    foreach($issue->{'fields'}->{'people'} as $person){ //Get all people 
     echo $person->{'emailAddress'}."<br/>";   //Get person's email 
    } 
} 

輸出:

[email protected]
[email protected]
[email protected]
frank @ gmai l.com


活生生的例子:

http://codepad.org/R1K0Lysi