php爆炸关联数组问题

时间:2011-04-17 13:29:08

标签: php arrays multidimensional-array

我有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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

当然它不起作用。爆炸只是按给定的分隔符拆分,但不会创建关联数组。

答案 2 :(得分:0)

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

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

但当然不建议这样做,因为它可能在很多方面出错。

无论如何,如果您需要更多帮助,我很确定您可以重构此代码或为我们提供更多背景信息。

答案 3 :(得分: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);

答案 4 :(得分: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),你将拥有:

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

所以你可以按照预期做到这一点,然后退出:

echo $array['Peter']