从字符串问题创建数组


Creating an array from a string issue

我有一个从字符串创建多维数组的函数。以下是每个字符串的输出外观:

字符串:

app.name.version
app.vendor

注意:这些是从数据库中检索的字符串

输出:

['app']['name']['version']
['app']['vendor']

我相应地为它们分配值。当我在字符串中包含表示子数组索引号的数字时,就会出现问题。下面是一个示例:

shifts.breaks.unpaid.0.description
shifts.breaks.unpaid.0.duration
shifts.breaks.unpaid.1.description
shifts.breaks.unpaid.1.duration

带输出:

Array
(
    [unpaid] => Array
        (
            [0] => Array
                (
                    [description] => Lunch
                )
            [1] => Array
                (
                    [duration] => 30
                )
            [3] => Array
                (
                    [description] => Lunch 2
                )
            [4] => Array
                (
                    [duration] => 30
                )
        )
)

它通常应该看起来像:

Array
(
    [unpaid] => Array
        (
            [0] => Array
                (
                    [description] => Lunch
                    [duration] => 30
                )
            [1] => Array
                (
                    [description] => Lunch 2
                    [duration] => 30
                )
        )
)

唯一可以解决这个问题的是,如果我用数字以外的任何数字替换数字,如下所示:

shifts.breaks.unpaid.b0.description
shifts.breaks.unpaid.b0.duration
shifts.breaks.unpaid.b1.description
shifts.breaks.unpaid.b1.duration
Array
(
    [unpaid] => Array
        (
            [b0] => Array
                (
                    [description] => Lunch
                    [duration] => 30
                )
            [b1] => Array
                (
                    [description] => Lunch 2
                    [duration] => 30
                )
        )
)

下面是创建数组的函数:

function toArray($keys, $value){
    $array = array();
    $ref = &$array;
    while(count($keys) > 0){
        $n = array_shift($keys);
        if(!is_array($ref))
            $ref = array();
        $ref = &$ref[$n];
    }
    $ref = $value;
    return $array;
}

其中$keys包含$keys = explode('.', "my.testing.string");,这是我一直在使用的示例:

$strings = array (
    "app.names.0.first"=> "Samuel",
    "app.names.0.last"=> "Smith",
    "app.names.1.first" => "Mary",
    "app.names.2.last" =>"Kubik"
);
$list = array();
foreach($strings as $key => $name) {
    $list[] = (toArray(explode('.', $key),$name));
}
print_r(call_user_func_array('array_merge_recursive', $list));

在这一点上,我不太确定这是否与array_merge_recursive有关。纠正此问题的任何帮助都会很棒!

我发现的一个解决方案是在不覆盖数字键的情况下重写一个新的array_merge_recursive函数。

function array_merge_recursive_new() {
        $arrays = func_get_args();
        $base = array_shift($arrays);
        foreach ($arrays as $array) {
            reset($base); //important
            while (list($key, $value) = @each($array)) {
                if (is_array($value) && @is_array($base[$key])) {
                    $base[$key] = array_merge_recursive_new($base[$key], $value);
                } else {
                    $base[$key] = $value;
                }
            }
        }
        return $base;
  }

感谢php.net上的用户.当键为数字时,这将产生正确的输出。