迭代部分数组会导致错误

时间:2011-11-16 10:55:30

标签: php

我有一些Json从facebook返回,然后我使用json _decode解析为一个数组。数据最终看起来像这样(这只是我感兴趣的片段):

( [data] =>
     Array ( [0] => 
         Array ( 
             [id] => 1336269985867_10150465918473072 
             [from] => 
                 Array ( [name] => a name here 
                         [category] => Community 
                         [id] => 1336268295867 ) 
                         [message] => A message here

现在我已经能够迭代这些数据并得到我需要的东西:

   $jsonDecoded = json_decode($json, true);
   $xmlOutput = '<?xml version="1.0"?><data><items>';
   foreach ($jsonDecoded as $e) {
       foreach ($e as $i) {
           $xmlOutput .= '<item><timestamp>' . $i['created_time'] . '</timestamp><title><![CDATA[ ' . $i['message'] .' ]]></title><link>' . $link . '</link><type>facebook</type></item>';
       }
   }

   $xmlOutput .= '</items></data>';

..直到现在我需要检查from-&gt; id值。

我在第二行中添加了这一行:

 foreach ($e as $i) {
     if($i['from']['id'] == '1336268295867') {

但这只是给我一个错误:

致命错误:无法在/ Users / Desktop / Webs / php / getFeeds中使用字符串偏移作为数组

任何想法为什么?我确定这是获得该值的正确方法,实际上如果我在循环中回应这个而不是上面的if语句我得到了值:

$jsonDecoded = json_decode($json, true);
$xmlOutput = '<?xml version="1.0"?><data><items>';
foreach ($jsonDecoded as $e) {
    foreach ($e as $i) {
       echo $i['from']['id']  

这会返回从facebook返回的代码中的所有from-&gt; id值,然后我会收到错误:

133626829985867133626829985867133626829985867133626829985867195501239202133626829985867133626829985867133626829985867133626829985867133626829985867
致命错误:无法在 97 /Users/Desktop/Webs/php/getFeeds.php 中将字符串偏移量用作数组>

(第97行是回声线)

2 个答案:

答案 0 :(得分:2)

在我看来(根据最后的代码片段)在某些时候你的$ i不再是一个数组了。尝试做:

$jsonDecoded = json_decode($json, true);
$xmlOutput = '<?xml version="1.0"?><data><items>';
foreach ($jsonDecoded as $e) {
    foreach ($e as $i) {
       if(is_array($i))
           echo $i['from']['id']  

答案 1 :(得分:2)

你的代码对$ i ['from'] ['id']做了很多假设,并且至少有一个条目对于至少一个条目是不正确的。
让我们添加一些测试:

$jsonDecoded = json_decode($json, true);
$xmlOutput = '<?xml version="1.0"?><data><items>';
foreach ($jsonDecoded as $e) {
    if ( !is_array($e) ) {
        die('type($e)=='.gettype($e).'!=array');
    }
    foreach ($e as $i) {
        if ( !is_array($i) ) {
            die('type($i)=='.gettype($i).'!=array');
        }
        else if ( !array_key_exists('from', $i) ) {
            die('$i has no key "from"');
        }
        else if ( !is_array($i['from']) ) {
            die('type($i["from"])=='.gettype($i['from']).'!=array');
        }
        else if ( !array_key_exists('id', $i['from']) ) {
            var_dump($i);
            die('$i["from"] has no key "id"');
        }

        echo $i['from']['id'];
    }
}

然后,您可以在var_dump(...)之前添加die(...)来查看实际数据。