PHP 5.4非法字符串偏移错误

时间:2014-06-27 18:00:06

标签: php

我正在使用foreach构造来查看从函数返回的数组。不幸的是,如果只有1个结果,那么这个函数会返回不同的结构。如果只有一个结果,我会得到以下结果:

array(3) {
  ["name"]=>
  string(5) "chris"
  ["admin"]=>
  string(5) "chris"
  ["time"]=>
  string(19) "2014/06/27 12:36:31"
}
string(34) "$1$9243ujf0i2j8ehdf24hdf9a8"

我正在努力获取[" name"]值。如果我使用以下代码,我的变量有正确的数据,但我得到一个非法字符串偏移错误:

foreach($res[1]['result']['user']['entry'] as $user) {
  $s = $user['name'];
  echo $s;
}

如何正确获取数组[" name"]值?或者我必须在更高级别做一些不同的事情?当有一个条目时,我得到的原始数据如下:

array(2) {
  ["@attributes"]=>
  array(2) {
    ["status"]=>
    string(7) "success"
    ["code"]=>
    string(2) "19"
  }
  ["result"]=>
  array(2) {
    ["@attributes"]=>
    array(2) {
      ["total-count"]=>
      string(1) "1"
      ["count"]=>
      string(1) "1"
    }
    ["user"]=>
    array(2) {
      ["@attributes"]=>
      array(2) {
        ["admin"]=>
        string(5) "chris"
        ["time"]=>
        string(19) "2014/06/27 12:39:58"
      }
      ["entry"]=>
      array(2) {
        ["@attributes"]=>
        array(3) {
          ["name"]=>
          string(5) "chris"
          ["admin"]=>
          string(5) "chris"
          ["time"]=>
          string(19) "2014/06/27 12:36:31"
        }
        ["phash"]=>
        string(34) "$1$9243ujf0i2j8ehdf24hdf9a8"
      }
    }
  }
}

以及有多个条目时的以下内容:

array(2) {
  ["@attributes"]=>
  array(2) {
    ["status"]=>
    string(7) "success"
    ["code"]=>
    string(2) "19"
  }
  ["result"]=>
  array(2) {
    ["@attributes"]=>
    array(2) {
      ["total-count"]=>
      string(1) "1"
      ["count"]=>
      string(1) "1"
    }
    ["user"]=>
    array(2) {
      ["@attributes"]=>
      array(2) {
        ["admin"]=>
        string(5) "chris"
        ["time"]=>
        string(19) "2014/06/27 12:57:32"
      }
      ["entry"]=>
      array(2) {
        [0]=>
        array(2) {
          ["@attributes"]=>
          array(3) {
            ["name"]=>
            string(5) "chris"
            ["admin"]=>
            string(5) "chris"
            ["time"]=>
            string(19) "2014/06/27 12:36:31"
          }
          ["phash"]=>
          string(34) "$1$9243ujf0i2j8ehdf24hdf9a8"
        }
        [1]=>
        array(2) {
          ["@attributes"]=>
          array(3) {
            ["name"]=>
            string(4) "test"
            ["admin"]=>
            string(5) "chris"
            ["time"]=>
            string(19) "2014/06/27 12:57:32"
          }
          ["phash"]=>
          string(34) "$1$as9d8jf238r9jf89j9238jr"
        }
      }
    }
  }
}

注意[" entry"]之后的额外索引数组级别。基本上,我只想要[" name"]值列表。

3 个答案:

答案 0 :(得分:1)

根据结果数量返回不同结构的服务将被打破。如果无法修复,您可以尝试对数据进行规范化,然后再进行处理:

if (!isset($res[1]['result']['user']['entry'][1]) {
    // Not an array, so change the structure to an array with one element:
    $res[1]['result']['user']['entry'] = array($res[1]['result']['user']['entry']);
}

// Now process the data as if the service is always returning an array

答案 1 :(得分:1)

您可以使用is_array

$test = $res[1]['result']['user']['entry'];
if (is_array($test)) {
    foreach($test as $user) {
        $s = $user['@attributes']['name'];
        echo $s;
    }
} else {
    $s = $test['@attributes']['name'];
    echo $s;
}

答案 2 :(得分:1)

您可以像这样标准化entry数组:

if(!isset($entries['result']['user']['entry'][0])) {
    $entry_list[] = $entries['result']['user']['entry'];
} else {
    $entry_list = $entries['result']['user']['entry'];
}

然后无忧虑地使用$entry_list操作新的foreach数组。