2011-04-17 63 views
3

我有如下的PHP脚本;php爆炸关联数组问题

$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34); 

$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34'; 

$array = explode(",", $ages2); 

echo $array["Peter"]; 

echo $ages["Peter"]; 

在这种情况下,echo $ages["Peter"];运作良好,但echo $array["Peter"];不工作。任何人都可以解决这个问题..

在此先感谢。

blasteralfred

+0

你从哪里得到该数组作为字符串? – 2011-04-17 13:31:26

+1

'var_dump($ array);''explode()'后面有基于数字的数组。 – zerkms 2011-04-17 13:31:34

+1

'$ ages2'把我扔了,它看起来像一个数组(假设复制/粘贴错误)。这有点奇怪。 – 2011-04-17 13:43:29

回答

4

你必须分两步走:

  • 首先,爆炸使用', ',作为分离器;获得如"Peter"=>32
  • ,然后,每个值,使用爆炸作为'=>'分离,分裂的姓名和年龄
    • 卸下双引号角落找寻的名字,当然数据块。


例如,你可以使用这样的事情:

$result = array(); 

$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34'; 
foreach (explode(', ', $ages2) as $couple) { 
    list ($name, $age) = explode('=>', $couple); 
    $name = trim($name, '"'); 
    $result[$name] = $age; 
} 

var_dump($result); 


而且,倾倒数组,你会得到下面的输出:

array 
    'Peter' => string '32' (length=2) 
    'Quagmire' => string '30' (length=2) 
    'Joe' => string '34' (length=2) 

这意味着使用这个:

echo $result['Peter']; 

会让你:

32 
3

当然,这是行不通的。爆炸只是按给定的分隔符分割,但不会创建关联数组。

0

你唯一的希望,如果你真的有这样一个字符串是手动解析它。无论是使用preg_match_all,或者我想你可以这样做:

$array = eval('return array('.$ages2.');'); 

但是,当然,这是不推荐,因为它可能出错在很多很多方面。

无论如何,我敢肯定你可以重构这段代码,或者如果你需要更多的帮助,可以给我们更多的上下文。

+0

这不起作用,您需要在eval'd表达式中分配值。 – zerkms 2011-04-17 13:35:46

+2

'如果eval是答案,你可能会问错误的问题 - Rasmus Lerdorf' – 2011-04-17 13:36:35

+0

@zerkms,对,我从来没有使用eval,我忘了它必须返回,修复。 @Madmartigan:确实这就是我想说的。我不假装这是一个很好的解决方案:) – Seldaek 2011-04-17 13:38:03

0

你需要通过提取姓名和年龄,以建立自己的数组:

<?php 
$array = array(); 
$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34'; 
foreach (explode(",", $ages2) as $element) { 
    $parts = explode("=>", $element); 

    if (count($parts) == 2) { 
     $name = str_replace(array('"', ' '), '', $parts[0]); 
     $age = (int) $parts[1]; 

     $array[$name] = $age; 
    } 
} 

print_r($array); 
0

$ ages2不是一个数组,所以你想在这里什么也不会直接工作,但你可以与结构转换字符串到像数组这样的:

$ages2 = '"Peter"=>32, "Quagmire"=>30, "Joe"=>34'; 

$items = explode(",", $ages2); 
foreach ($items as $item) { 
    list($key,$value) = explode('=>',$item); 
    $key = str_replace('"','',trim($key)); // Remove quotes and trim whitespace. 
    $array[$key] = (int)$value; 
} 

如果你的var_dump($阵列),你必须:

array(3) { 
    ["Peter"]=> 
    int(32) 
    ["Quagmire"]=> 
    int(30) 
    ["Joe"]=> 
    int(34) 
} 

所以你可以按预期做到这一点,并得到32退出:

echo $array['Peter']