字符串到可变深度多维数组

时间:2010-08-02 11:57:10

标签: php multidimensional-array

我正在尝试从字符串创建一个多维数组(从$ _GET接收,输入已经过验证,但在此示例中没有)。每个' - '表示多维数组中的一个级别。

值可以看起来像这样(任何形式,只要键之间存在' - ')。值数组可以映射到多维数组中的任何深度。

$array = array(
  'page-title' => 'Title of a page',
  'page-url' => 'http://www.mypage.com',
  'meta-page-author' => 'Some guy',
  'meta-page-created' => 'some timestamp'
);

我尝试了不同的解决方案,但到目前为止唯一有效的方法是初始循环和密钥提取。

foreach ($array as $key => $value) {
  if (strpos($key, '-') !== false) {
    $keyArray = explode('-', $key);
    // ??
  }
}

我希望的输出应该如下所示:

array(
  'page' => array(
      'title' => 'Title of a page',
      'url' => 'http://www.mypage.com'
  ),
  'meta' => array(
      'page' => array(
         'author' => 'Some guy',
         'created' => 'some timestamp'
       )
  )
);

3 个答案:

答案 0 :(得分:4)

这样的事情应该有效:

<?php
$array = array(
  'page-title' => 'Title of a page',
  'page-url' => 'http://www.mypage.com',
  'meta-page-author' => 'Some guy',
  'meta-page-created' => 'some timestamp'
);

$result = array();

foreach ($array as $key => $value) {
    $keys = strpos($key, '-') !== false ? explode('-', $key) : array($key);
    $ptr = &$result;
    foreach ($keys as $k) {
        if (!isset($ptr[$k])) {
            $ptr[$k] = array();
        }
        $ptr = &$ptr[$k];
    }
    if (empty($ptr)) {
        $ptr = $value;
    } else {
        $ptr[] = $value;
    }
}

print_r($result);

我所做的就是像你一样爆炸你的钥匙。然后我循环通过它们创建一个新的数组,如果该数组尚不存在。使用引用我保存我在数组中的当前点。然后,一旦我按下最后一个键,我就分配了值。希望这会有所帮助。

编辑:根据cHao的建议我改变了

$keys = strpos($key, '-') !== false ? explode('-', $key) : $key;

$keys = strpos($key, '-') !== false ? explode('-', $key) : array($key);

防止foreach失败。

编辑2:我改变了

$ptr = $value;

if (empty($ptr)) {
    $ptr = $value;
} else {
    $ptr[] = $value;
}

处理以下案件:

$array = array(
  'page-title' => 'Title of a page',
  'page-url' => 'http://www.mypage.com',
  'meta-page-author' => 'Some guy',
  'meta-page-created' => 'some timestamp',
  'page' => 'foo'
);

答案 1 :(得分:1)

正如你所知,PHP可以接受像这样的整个大型数组。如果您将表单元素命名为'somename [page] [title]',那么当表单返回时,您应该看到它们已在$ _GET中排列为数组。

如果你的心脏设置在当前的命名方案上,但是......

$result = array();

foreach ($array as $key => $value) {
    $current =& $result;
    if (strpos($key, '-') !== false) {
        $keyArray = explode('-', $key);
        $bottomKey = array_pop($keyArray);
        foreach ($keyArray as $subKey) {
            if (!isset($current[$subKey]))
                $current[$subKey] = array();
            $current =& $current[$subKey];
        }
    } else {
        $bottomKey = $key;
    }

    $current[$bottomKey] = $value;
}

答案 2 :(得分:0)

<?php
$array = array(
  'page-title' => 'Title of a page',
  'page-url' => 'http://www.mypage.com',
  'meta-page-author' => 'Some guy',
  'meta-page-created' => 'some timestamp'
);
$result = array();
foreach ($array as $key => $value) {
    if (strpos($key, '-') !== false) {
        $ak = "result['" . str_replace('-', '\'][\'', $key) . "'] = \"".$value."\"";
        eval('$'.$ak.';');
    }
}
var_dump($result);
?>

希望有所帮助