Php 从字符串创建多维关联数组

Php 从字符串创建多维关联数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我想从字符串创建多维关联数组。从包含字符串的变量创建数组无效。(使用PHP7.1.13进行测试) 有效示例: $myVar = array('Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'], 'Projets éducatifs'=> ['10'=>'Projet 4','33'=>'Projet 5','34'=>

我想从字符串创建多维关联数组。从包含字符串的变量创建数组无效。(使用PHP7.1.13进行测试)

有效示例:

$myVar = array('Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'],
               'Projets éducatifs'=>  ['10'=>'Projet 4','33'=>'Projet 5','34'=>'Projet 6']);
print_r($myVar);
$myVar2 = "'Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'],'Projets éducatifs'=>['10'=>'Projet 4','33'=>'Projet 5','34'=>'Projet 6']";
$myVar3 = array($myVar2);
print_r($myVar3);
返回良好结果:

Array
(
  [Projets associatifs] => Array
    (
        [29] => Projet 1
        [15] => Projet 2
        [28] => Projet 3
    )
  [Projets éducatifs] => Array
    (
        [10] => Projet 4
        [33] => Projet 5
        [34] => Projet 6
    )
)
不起作用的示例:

$myVar = array('Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'],
               'Projets éducatifs'=>  ['10'=>'Projet 4','33'=>'Projet 5','34'=>'Projet 6']);
print_r($myVar);
$myVar2 = "'Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'],'Projets éducatifs'=>['10'=>'Projet 4','33'=>'Projet 5','34'=>'Projet 6']";
$myVar3 = array($myVar2);
print_r($myVar3);
返回错误结果:

Array
(
  [0] => 'Projets associatifs'=>['29'=>'Projet 1','15'=>'Projet 2','28'=>'Projet 3'],'Projets éducatifs'=>['10'=>'Projet 4','33'=>'Projet 5','34'=>'Projet 6']
)

如何使我的字符串变量
$myVar2
被接受以创建数组?

如果没有一些疯狂的正则表达式来解析字符串,你就无法做到这一点。如果您可以将字符串转换为json,那么就可以了

那么这个 “'Projets Associations'=>['29'=>'Projet 1'、'15'=>'Projet 2'、'28'=>'Projet 3']、'Projets教育计划'=>['10'=>'Projet 4'、'33'=>'Projet 5'、'34'=>'Projet 6']”

会变成这样

{Projets associations:{29:'Projet 1'},{15:'Projet 2'}

我没有对此进行测试,因此您需要找出如何编写json以满足您的需要,但随后您可以运行该字符串,它将创建您正在寻找的结构

请注意,json与对象一起工作。因此,您可以从json_解码中获取对象,如果对象不工作,则需要将其转换为关联数组


但是,如果您发现自己在做这样愚蠢的事情,您应该重新评估您正在尝试做的事情,并可能找到解决方案的另一条路径。

因为它在PHP中是一个有效的数组定义,您可以
将其作为PHP代码进行评估:

eval("\$myVar3 = array($myVar2);");
print_r($myVar3);
或者将其转换为JSON并解码。可能更容易,但我做到了:

$myVar2 = str_replace(["'", '=>', '[', ']'], ['"', ':', '{', '}'], $myVar2);
$myVar3 = json_decode('{'.$myVar2.'}', true);
print_r($myVar3);

但如果您要创建/存储这个,那么最好首先存储JSON。

从包含字符串的变量创建数组不起作用
这是一种预期行为,PHP不会将字符串变为数组,即使它们看起来像数组。Ok。由于存在序列化和非序列化方法,我认为我们可以强制一个格式正确的字符串成为一个数组。我可以为此编写一个解析器,但我现在没有时间。单靠正则表达式可能不够,您必须编写一个标记器来处理嵌套。当涉及到嵌套数据时,正则表达式失败得很厉害。下面是我处理JSON对象的一个例子,基本上是JSON,如果我有时间,我会为它们写一个。@Halfstop:这是我考虑过的一个选项,即使它看起来很奇怪。所以,我刚刚测试了它。使用JSON_decode($var,$assoc=TRUE)将返回的对象转换为关联数组。这非常适合我的示例。@ArtisticPhoenix:UHHHH为什么?我可以编写自己的JSON或HTML解析器,但已经有了相应的工具。因为这很有趣……我喜欢制作它们。不过我有一个方法。我有一些示例,比如我制作的HTML迷你程序。我实际上制作了一个JSON迷你程序,但它用于JSON对象,基本上是不带引号的JSON键。@abracadver:eval(\$myVar3=array($myVar2););运行良好,似乎是一种更简单的方法。@cyrcle-
eval
也带来了巨大的安全问题,因为它还将执行作为字符串提供给它的任何有效php。因此,如果最终用户输入有可能被放入其中,我不会使用
eval
@ArtisticPhoenix:在我的情况下,变量不包含user输入。该变量仅包含导航菜单的站点地图。我认为在这种情况下,我可以安全地使用
eval