使用由附加字符串组成的变量构建多维数组

时间:2013-03-11 03:32:17

标签: php multidimensional-array

这是我原始代码的示例,它似乎有用:

$MainArray =  array('Part1'=>array(Foo, 4, 2, Cat), 'Part2'=>array(Bar, 3, 1, Dog));
print_r ($MainArray);

返回:

Array ( [Part1] => Array ( [0] => Foo [1] => 4 [2] => 2 [3] => Cat ) [Part2] => Array ( [0] => Bar [1] => 3 [2] => 1 [3] => Dog ) ) 

我想做的是这样的事情(根据if语句包含的部分):

$ArrayPieces.="'Part1'=>array(Foo, 4, 2, Cat), ";
$ArrayPieces.="'Part2'=>array(Bar, 3, 1, Dog)";
$MainArray =  array($ArrayPieces);
print_r ($MainArray);

但是这会回来:

Array ( [0] => 'Part1'=>array(Foo, 4, 2, Cat), 'Part2'=>array(Bar, 3, 1, Dog))

有关如何使这项工作的任何建议?谢谢!

3 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法(根据需要)是使用eval()

<?php

$MainArray =  array('Part1'=>array('Foo', 4, 2, 'Cat'), 'Part2'=>array('Ba$
print_r ($MainArray);

$ArrayPieces = "return array(";
$ArrayPieces .= "'Part1'=>array('Foo', 4, 2, 'Cat'), ";
$ArrayPieces .= "'Part2'=>array('Bar', 3, 1, 'Dog')";
$ArrayPieces .= ");";

$MainArray =  eval($ArrayPieces);

print_r ($MainArray);

?>

至于为什么数组字符串中有返回,这是因为 eval只接受语句,而不是表达式。

以上代码将为您提供所需内容:

Array
(
    [Part1] => Array
        (
            [0] => Foo
            [1] => 4
            [2] => 2
            [3] => Cat
        )

    [Part2] => Array
        (
            [0] => Bar
            [1] => 3
            [2] => 1
            [3] => Dog
        )

)

但是,这通常不是 。一点都没!这是非常不安全的(特别是在评估用户输入时 - 你应该避免在大多数情况下(如果不是所有情况下)进行操作)并且在某些情况下,它比它的价值更麻烦。

有关此问题的更多信息,请参阅:

When is eval evil in php?

答案 1 :(得分:0)

鉴于你的问题是基于假装的情况,很难确切地知道你在寻找什么,但我认为这样的事情应该能实现你所追求的目标:

$MainArry = array();
if (foo)
    $MainArray['Part1'] = array(Foo, 4, 2, Cat);
if (bar)
    $MainArray['Part2'] = array(Bar, 3, 1, Dog);

答案 2 :(得分:0)

听起来你试图反序列化一个数组。根据您的示例,您希望在字符串中构造PHP语法,然后再执行它。

如果您绝对必须这样做,请查看the eval PHP function

就个人而言,我不喜欢“eval”。

是否有机会使用JavaScript Object Notation?如果是这样,请将您的上述示例表达为:

$json_pieces = '{';
$json_pieces .= '"Part1": ["Foo", 4, 2, "Cat"],';
$json_pieces .= '"Part2": ["Bar", 3, 1, "Dog"]';
$json_pieces .= '}'
$MainArray = json_decode( $json_pieces, TRUE );
print_r( $main_array );