我正在尝试生成一个多维数组,其深度等于正则表达式中找到的匹配数。数组键是每个匹配的字符串值。
例如:
preg_match('/([A-Z])\-?([0-9])\-?([0-9]{1,3})/i', 'A-1-001', $matches);
返回:
Array (
[0] => A-1-001
[1] => A
[2] => 1
[3] => 001
)
我要转换为:
$foo = array(
'A' => array(
'1' => array(
'001' => array('some', 'information')
)
)
);
这样我就可以将它与另一个多维数组合并,如下所示:
$bar['A']['1']['001'] = array('some', 'other', 'information');
该过程需要处理任意数量的匹配/维度。
以下是我目前的做法。我没有理解这个概念,因为这种尝试远远落后于我的目标。
$foo = array();
$j = count($matches);
for ($i = 1; $i < $j; $i++) {
$foo[ $matches[$i - 1] ] = $matches[$i];
}
/*
$foo's structure becomes:
Array (
[A-1-001] => A
[A] => 1
[1] => 001
)
*/
它只是交换数组键,而不是创建我需要的新子数组。
非常感谢任何建议或解决方案。谢谢!
答案 0 :(得分:2)
使用一些PHP-Fu:
$matches = array('A-1-001', 'A', 1, '001');
$info = array('some', 'information');
print_r(tree($matches, $info));
function tree($array, $info){
$max = count($array)-1;
$result = array($array[$max] => $info);
for($i=$max-1;$i>0;$result = array($array[$i--] => $result));
return $result;
}
<强>输出:强>
Array
(
[A] => Array
(
[1] => Array
(
[001] => Array
(
[0] => some
[1] => information
)
)
)
)
答案 1 :(得分:1)
这可以通过几种方式完成,例如使用递归。现在我脑子里还有另一个想法。您使用array_reverse
翻转数组。这样我们就可以从后面构建到前面。
然后我们可以设置一切。所以代码将遵循以下内容
$foo = array();
$reversed = array_reverse($matches);
$some_info_array = array('some', 'information');
foreach($reversed as $key) {
if(empty($foo)) {
$foo[$key] = $some_info_array;
} else {
$foo[$key] = $foo;
}
}
代码未经测试但应该给你一个想法/开始
答案 2 :(得分:1)
给出原始数组:
$original_array = array( 'A-1-001', 'A', '1', '001' );
您可以将其转换为您所描述的格式:
$new_array[ $original_array[1] ] = array( $original_array[2] => $original_array[3] );
这会产生
array(1) {
["A"]=>
array(1) {
[1]=>
string(3) "001"
}
}
然后,您可以按照指示为该数组指定值:
$new_array['A']['1']['001'] = array('some', 'information');
答案 3 :(得分:1)
你可以使用这样的功能......它应该覆盖任何深度。奖励是你可以继续将$ tree的值传递给更多分支,并获得包含多个产品的单个树。
function arrayToTree($array, &$tree, $addlAttribs){
$node = array_shift($array);
if (count($array)){
// this is a branch
$tree[$node] = array();
return arrayToTree($array, $tree[$node]);
} else {
$tree[$node] = $addlAttribs;
return;
}
}
你会像
一样使用它$t = array();
array_shift($matches); // remove the first match "A-1-001"
arrayToTree($matches, $tree, $productInfo);
print_r($tree);