解析返回数组和字符串的API结果

时间:2015-02-10 17:14:00

标签: php arrays foreach

我从API返回了一些数据,格式如下:

string(15) "hello@yahoo.com"
bool(true)
string(7) "generic"
array(5) {
  ["server"]=>
  string(19) "imap.mail.yahoo.com"
  ["username"]=>
  string(15) "hello@yahoo.com"
  ["port"]=>
  int(993)
  ["use_ssl"]=>
  bool(true)
  ["oauth"]=>
  bool(false)
}
array(0) {
}

当我尝试使用foreach循环解析它时,它不成功。我假设这是因为位于实际数组上方的string(15)bool(true)string(7)数据。

这是我的foreach循环:

$results = array();
foreach ($Request->getResults() as $imapSettings) {
    $results['server'] = $imapSettings['server'];
    $results['username'] = $imapSettings['username'];
    $results['port'] = $imapSettings['port'];
    $results['use_ssl'] = $imapSettings['use_ssl'];
    $results['oauth'] = $imapSettings['oauth'];
}

当我运行上面的代码时,我收到以下错误:Warning: Illegal string offset 'server' in。我相信这个错误通常表明某些东西不是数组。

所以我的问题是如何解析这段数据?

更新:

以下是var_dump($Request->getResults());返回:

array(5) {
  ["email"]=>
  string(15) "hello@yahoo.com"
  ["found"]=>
  bool(true)
  ["type"]=>
  string(7) "generic"
  ["imap"]=>
  array(5) {
    ["server"]=>
    string(19) "imap.mail.yahoo.com"
    ["username"]=>
    string(15) "hello@yahoo.com"
    ["port"]=>
    int(993)
    ["use_ssl"]=>
    bool(true)
    ["oauth"]=>
    bool(false)
  }
  ["documentation"]=>
  array(0) {
  }
}

2 个答案:

答案 0 :(得分:1)

我认为这就是你要做的事情:

$response = $Request->getResults();

$results['server']   = $response['imap']['server'];
$results['username'] = $response['imap']['username'];
$results['port']     = $response['imap']['port'];
$results['use_ssl']  = $response['imap']['use_ssl'];
$results['oauth']    = $response['imap']['oauth'];

您不需要遍历结果 - 您只需从结果中包含的'imap'数组中提取所需的信息。

此外,您可以更简洁地执行此操作,这将产生相同的结果:

$results = $response['imap'];

答案 1 :(得分:0)

foreach仅适用于数组,因此您应该转义其他类型:

$results = array();
foreach ($Request->getResults() as $imapSettings) {
    if (!is_array($imapSettings)) {
        // you can do other stuff for other type
        continue;
    }
    $results['server'] = $imapSettings['server'];
    $results['username'] = $imapSettings['username'];
    $results['port'] = $imapSettings['port'];
    $results['use_ssl'] = $imapSettings['use_ssl'];
    $results['oauth'] = $imapSettings['oauth'];
}