我正在尝试从字符串创建一个多维数组(从$ _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'
)
)
);
答案 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);
?>
希望有所帮助