2012-11-26 227 views
13

我正在使用亚马逊产品广告API。值作为多维对象返回。将多维对象转换为数组

它看起来像这样:

object(AmazonProduct_Result)#222 (5) { 
    ["_code":protected]=> 
    int(200) 
    ["_data":protected]=> 
    string(16538) 
array(2) { 
    ["IsValid"]=> 
    string(4) "True" 
    ["Items"]=> 
    array(1) { 
     [0]=> 
     object(AmazonProduct_Item)#19 (1) { 
     ["_values":protected]=> 
     array(11) { 
      ["ASIN"]=> 
      string(10) "B005HNF01O" 
      ["ParentASIN"]=> 
      string(10) "B008RKEIZ8" 
      ["DetailPageURL"]=> 
      string(120) "http://rads.stackoverflow.com/amzn/click/B005HNF01O" 
      ["ItemLinks"]=> 
      array(7) { 
      [0]=> 
      object(AmazonProduct_ItemLink)#18 (1) { 
       ["_values":protected]=> 
       array(2) { 
       ["Description"]=> 
       string(17) "Technical Details" 
       ["URL"]=> 
       string(217) "http://rads.stackoverflow.com/amzn/click/B005HNF01O" 
       } 
      } 
      [1]=> 
      object(AmazonProduct_ItemLink)#17 (1) { 
       ["_values":protected]=> 
       array(2) { 

我的意思是它也有内部的对象数组。我想将它们全部转换成多维数组。

+1

为什么你需要这是一个数组?许多常见的数组任务(如foreach)也可以用于对象。 – MrGlass

+0

如何检查值是否存在于对象中?我试过使用isset,但它不工作。 – user1091558

+0

由于它的一个对象,该值应该始终存在。你应该检查它的设置是否可用(或者只是空) – MrGlass

回答

11

可以使用递归函数如下图所示:

function objToArray($obj, &$arr){ 

    if(!is_object($obj) && !is_array($obj)){ 
     $arr = $obj; 
     return $arr; 
    } 

    foreach ($obj as $key => $value) 
    { 
     if (!empty($value)) 
     { 
      $arr[$key] = array(); 
      objToArray($value, $arr[$key]); 
     } 
     else 
     { 
      $arr[$key] = $value; 
     } 
    } 
    return $arr; 
} 
+0

您可能需要使它成为这个共同的要求更整洁 – SubRed

+5

稍微整洁的方法: 功能objectToArray($数据),如果 { (is_object($数据)){ $数据= get_object_vars($数据) ; } if(is_array($ data)){ return array_map(__ FUNCTION__,$ data); } else { return $ data; } } –

+0

hello @SubRed,你的回答似乎对我有帮助!我的查询是我们必须传递'&$ arr'? – SagarPPanchal

75

我知道这是旧的,但你可以尝试下面的代码:

$阵列= json_decode(json_encode($对象) ,真);

其中$ object是API的响应。

+3

有用和快速的解决方案... –

+2

你知道吗。我爱你。 – sulmanpucit

+2

我确定你一直都有这个超级英雄,但你只是救了我的命。 – FueledPublishing

1
function convertObjectToArray($data) { 
    if (is_object($data)) { 
     $data = get_object_vars($data); 
    } 

    if (is_array($data)) { 
     return array_map(__FUNCTION__, $data); 
    } 

    return $data; 
} 

Credit to Kevin Op den Kamp。

0

万一你来到这里,像我一样,并没有找到适合自己情况的正确答案,以前的答案之一,这个修改后的版本是什么最终为我工作:

protected function objToArray($obj) 
{ 
    // Not an object or array 
    if (!is_object($obj) && !is_array($obj)) { 
     return $obj; 
    } 

    // Parse array 
    foreach ($obj as $key => $value) { 
     $arr[$key] = $this->objToArray($value); 
    } 

    // Return parsed array 
    return $arr; 
} 

的原始值是一个JSON字符串。该方法调用如下所示:

$array = $this->objToArray(json_decode($json, true)); 
0

我写了一个函数来完成这项工作,并且还将所有json字符串转换为数组。这对我来说很好。

function is_json($string) { 
    // php 5.3 or newer needed; 
    json_decode($string); 
    return (json_last_error() == JSON_ERROR_NONE); 
} 

function objectToArray($objectOrArray) { 
    // if is_json -> decode : 
    if (is_string($objectOrArray) && is_json($objectOrArray)) $objectOrArray = json_decode($objectOrArray); 

    // if object -> convert to array : 
    if (is_object($objectOrArray)) $objectOrArray = (array) $objectOrArray; 

    // if not array -> just return it (probably string or number) : 
    if (!is_array($objectOrArray)) return $objectOrArray; 

    // if empty array -> return [] : 
    if (count($objectOrArray) == 0) return []; 

    // repeat tasks for each item : 
    $output = []; 
    foreach ($objectOrArray as $key => $o_a) { 
     $output[$key] = objectToArray($o_a); 
    } 
    return $output; 
}