PHP分割关联数组问题

3
我有以下的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

你从哪里获取到那个数组的字符串? - user142162
1
var_dump($array); 你在 explode() 后得到了一个数字数组。 - zerkms
1
$ages2 让我有点摸不着头脑,它看起来像是一个数组(我猜想这是复制/粘贴错误)。这有点奇怪。 - Wesley Murch
5个回答

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
当然不起作用。explode只是按给定的分隔符拆分字符串,但不会创建关联数组。

0
你如果真的有这样一个字符串的话,唯一的希望就是手动解析它。可以使用 preg_match_all 进行解析,或者你也可以尝试:
$array = eval('return array('.$ages2.');');

当然,这并不推荐,因为它可能会以许多方式出错。

无论如何,如果您需要更多帮助,我相信您可以重构此代码或为我们提供更多上下文。


2
If eval is the answer, you are probably asking the wrong question - Rasmus Lerdorf - Wesley Murch
@zerkms,没错,我从来不使用eval,以至于我忘记它必须返回了,已经修复了。@Madmartigan:确实这就是我想说的。我并不是在假装这是一个好的解决方案 :) - Seldaek
@Seldaek:哦,不知道在 eval 中的 return 的行为就像你所写的那样 :-S 尽管我在我的 8 年 PHP 实践中从未使用过它 :-S - zerkms
这确实是一些创造性的思考!不过,我认为这个人使用一个看起来像关联数组的字符串有点混淆了。这绝对感觉像是那种你得问:“你为什么要这样做?”的问题。 - Wesley Murch
@Madmartigan 当然,我不可能找到一个好的解释。特别是如果它是以这种方式硬编码的,但我们又有什么资格去评判呢? :) - Seldaek
显示剩余5条评论

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),你会得到以下结果:
array(3) {
  ["Peter"]=>
  int(32)
  ["Quagmire"]=>
  int(30)
  ["Joe"]=>
  int(34)
}

所以您可以按预期执行此操作并获得32的返回:

echo $array['Peter']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接