2012-07-22 31 views
-1

我有使用由Piwik API提供的阵列,在PHP格式麻烦的,因为它的代码在这里输出:转换一个多维阵列,和/或转换为stdClass的对象

array (
0 => 
    array (
    'idsite' => '2', 
    'name' => 'coolrob335.com', 
    'main_url' => 'http://coolrob335.com', 
    'ts_created' => '2012-06-02 21:05:56', 
    'ecommerce' => '0', 
    'timezone' => 'Europe/London', 
    'currency' => 'GBP', 
    'excluded_ips' => '', 
    'excluded_parameters' => '', 
    'group' => '', 
    'feedburnerName' => NULL, 
), 
1 => 
    array (
    'idsite' => '3', 
    'name' => 'robbrazier.com', 
    'main_url' => 'http://robbrazier.com', 
    'ts_created' => '2012-06-04 14:17:28', 
    'ecommerce' => '0', 
    'timezone' => 'Europe/London', 
    'currency' => 'GBP', 
    'excluded_ips' => '', 
    'excluded_parameters' => '', 
    'group' => '', 
    'feedburnerName' => NULL, 
), 
) 

我什么想知道的是:有没有办法直接操纵这个数组,因为使用$ obj [0] ['idsite'],$ obj [0] - > idsite不工作(我知道后者不起作用,因为它不是一个stdClass对象)。

因此,有一种方法,在上述链接中所示的数组转换从

array (
    0 => 
    array (
     'idsite' => '2', 

为类似

array (
    0 => 
    array (
     ['idsite'] => '2', 

或将其转换为stdClass的对象,因此,它可以是操纵? (我已搜查SO和谷歌的一个多维数组转换成stdClass的对象,并没有任何的解决方案在这种情况下工作可能由于他们不是作为[] => ''

在一个旁注: 我所试图做的从这个是得到“idsite”和“名”,将其转换为与“名称”作为链接的标题列表,以便例如,它会是

$url = "{$user_data['piwik_server']}/index.php?module=API&method=API.get&idSite={$obj->id}&format=PHP&prettyDisplay=1&serialize=0&token_auth={$user_data['apikey']}" 

<a href="<?php $url; ?>"><?php $obj->name; ?></a> 

(我知道,这将极有可能在foreach/while循环中有效工作)

回答

1

使用你提供的数组,下面的代码:

function toObject($any) { 
    $rv = new stdClass(); 

    if (is_array($any)) { 
     foreach($any as $k => $v) { 
      $rv->$k = is_array($v) 
       ? toObject($v) 
       : $v; 
     } 
    } else { 
     $rv = (object) $any; 
    } 

    return $rv; 
} 

$o = toObject($a); 

var_dump($o); 

会产生这样的输出:

object(stdClass)#1 (2) { 
    ["0"]=> 
    object(stdClass)#2 (11) { 
    ["idsite"]=> 
    string(1) "2" 
    ["name"]=> 
    string(14) "coolrob335.com" 
    ["main_url"]=> 
    string(21) "http://coolrob335.com" 
    ["ts_created"]=> 
    string(19) "2012-06-02 21:05:56" 
    ["ecommerce"]=> 
    string(1) "0" 
    ["timezone"]=> 
    string(13) "Europe/London" 
    ["currency"]=> 
    string(3) "GBP" 
    ["excluded_ips"]=> 
    string(0) "" 
    ["excluded_parameters"]=> 
    string(0) "" 
    ["group"]=> 
    string(0) "" 
    ["feedburnerName"]=> 
    NULL 
    } 
    ["1"]=> 
    object(stdClass)#3 (11) { 
    ["idsite"]=> 
    string(1) "3" 
    ["name"]=> 
    string(14) "robbrazier.com" 
    ["main_url"]=> 
    string(21) "http://robbrazier.com" 
    ["ts_created"]=> 
    string(19) "2012-06-04 14:17:28" 
    ["ecommerce"]=> 
    string(1) "0" 
    ["timezone"]=> 
    string(13) "Europe/London" 
    ["currency"]=> 
    string(3) "GBP" 
    ["excluded_ips"]=> 
    string(0) "" 
    ["excluded_parameters"]=> 
    string(0) "" 
    ["group"]=> 
    string(0) "" 
    ["feedburnerName"]=> 
    NULL 
    } 
} 
+0

感谢您的快速回复:) 不幸的是,这似乎并没有在这种情况下工作,它显示了这一点:http://beta.piwilytics.com/multidimensionalarray.php。 我有一种感觉,这是因为数组格式不正确? – 2012-07-22 19:40:22

+0

不幸的是,有些类型的变量不能使用'(object)'进行转换,例如资源或数据库连接句柄 – 2012-07-22 19:46:21

0

试试这个

$arr=array (
    array (
     'idsite' => '2', 
     'name' => 'coolrob335.com', 
     'main_url' => 'http://coolrob335.com', 
     'ts_created' => '2012-06-02 21:05:56', 
     'ecommerce' => '0', 
     'timezone' => 'Europe/London', 
     'currency' => 'GBP', 
     'excluded_ips' => '', 
     'excluded_parameters' => '', 
     'group' => '', 
     'feedburnerName' => NULL, 
    ), 
    array (
     'idsite' => '3', 
     'name' => 'robbrazier.com', 
     'main_url' => 'http://robbrazier.com', 
     'ts_created' => '2012-06-04 14:17:28', 
     'ecommerce' => '0', 
     'timezone' => 'Europe/London', 
     'currency' => 'GBP', 
     'excluded_ips' => '', 
     'excluded_parameters' => '', 
     'group' => '', 
     'feedburnerName' => NULL, 
    ), 
); 


foreach($arr as $k=>$v) $obj[$k]=(object)$v; 
echo $obj[0]->idsite; // 2 
echo $obj[0]->name; // coolrob335.com 

DEMO.

+1

真棒!我看到这是如何与原始数据数组一起工作的,但是当我使用API​​并在url上使用file_get_contents()时,我该如何解决这个问题? 我之前尝试过的与您所说的没有任何关系,但是当我完全按照您所发布的内容进行操作时,它完美地起作用。我现在所拥有的是: '$ url =“{$ server} /index.php?module=API&method=SitesManager。getAllSites&format = PHP&prettyDisplay = 1&serialize = 0&token_auth = {$ apikey}“; $ php = file_get_contents($ url); $ arr = array($ php); foreach($ arr as $ i => $ o)$ obj [ $ i] =(object)$ o; \t echo $ obj [0] - > idsite; \t echo $ obj [0] - > name;' – 2012-07-22 20:03:36

+0

我认为它应该是'foreach($ php as $ i = > $ o);'如果它是($ php)返回的数组。 – 2012-07-22 20:07:30

+0

抱歉,如果我是一个痛苦,但它说'警告:无效参数为foreach()在/home2/coolrob1/public_html/piwilytics.com /beta/multidimensionalarray.php在第28行,这是'foreach($ php为$ i => $ o)$ obj [$ i] =(object)$ o;'所以我认为这是一个问题数组$ php,但是,通常打印出正常,我有点卡住了。我已经在http://beta.piwilytics.com/multidimensionalarray.php – 2012-07-22 20:24:48

0

你应该使用与PHP的数据PIwik API的时候做的,就是设置&在HTTP请求中serialize = 1(而不是serialize = 0,你正在做),然后sim层运行

$value = unserialize($value); 

然后,您将获得准备使用的阵列。