寻找构建多维、多层、关联数组的方法
Searching for a way to construct a multidimensional, multilayered, associative Array
所以我 运行 在遍历字符串并将它的字符作为索引数组插入多维关联数组时遇到了麻烦。所以基本上是一堆多维数组中的多维数组中的多维数组.....
这有点麻烦,因为我不能用手做。我需要一种自动化的方式来处理一堆字符串。我认为以下示例将更好地解释它:
//string i want to enter
$string = 'ADAM';
//array i want to end up with
$result = array
(
'A'=> array
(
'D'=>array
(
'A'=>array
(
'M'=>array
(
'result'=>'ADAM'
)
)
)
)
)
我最初的方法只是使用 if 条件将第一个 Char 作为数组插入到主数组中,例如:
for($i = 0; $i < strlen($string); $i++){
if($i == 0){
$array1[$word[$i]] = array();
}
}
效果很好。但后来我 运行 进入我的问题:我如何跟踪数组中的当前点?
在 if 检查之后,我会选择一个 else 语句,该语句在 $i 大于 0 时起作用。但是如果我想插入数组的下一个维度,在这种情况下为 'D',我需要到 select $array1['A'],下一个我需要 $array1['A']['D'] 等等。我还没找到办法要做到这一点。我需要进入这个数组的字符串从 4-70 个字符不等。
我知道的每种方法都只改变了二维,所以我最终得到:
$array1('A'=>array ('A' =>array()));
$array1('A'=>array ('D' =>array()));
$array1('A'=>array ('A' =>array()));
$array1('A'=>array ('M' =>array()));
或者索引本身是数组导致的非法偏移错误。
也许我在这里的方法是不可能的,但我仍然认为我可能会问以防万一我遗漏了什么。
在后期,我希望对所有字符串使用相同的数组,所以我基本上使用字符作为节点。如果 'A' 作为第一个字符已经存在,我将跳过它并插入第二个字符将下一个字符串放入 'A'-Array 等
提前致谢!
您可以使用引用,以便在遍历字符串时将下一个字符添加为数组的键,然后将此新条目设置为循环中下一个操作的添加点...
$string = 'ADAM';
$result = [];
$add = &$result;
for($i = 0; $i < strlen($string); $i++){
$add = &$add[$string[$i]];
}
$add['result'] = $string;
print_r($result);
只是为了说明如何添加多个条目...
addEntry ( $result, "ADAM");
addEntry ( $result, "ALAN");
addEntry ( $result, "ADAME");
function addEntry ( &$result, string $newValue ) {
for($i = 0; $i < strlen($newValue); $i++){
$result = &$result[$newValue[$i]];
}
$result['result'] = $newValue;
}
结果...
Array
(
[A] => Array
(
[D] => Array
(
[A] => Array
(
[M] => Array
(
[result] => ADAM
[E] => Array
(
[result] => ADAME
)
)
)
)
[L] => Array
(
[A] => Array
(
[N] => Array
(
[result] => ALAN
)
)
)
)
)
您可以为此使用递归函数。
function nest(string $str, int $i = 0) {
return isset($str[$i]) ? [$str[$i] => nest($str, $i + 1)] : ['result' => $str];
}
$result = nest($string);
这是您要实现的目标的解决方案。查看有效的解决方案 here,并附上说明其有效的评论。
$val = 'ADAM';
$arr = [];
$keys = str_split($val);
$curr = &$arr;
foreach($keys as $key) {
$curr = &$curr[$key];
}
$curr = ['result' => $val];
print_r($arr);
所以我 运行 在遍历字符串并将它的字符作为索引数组插入多维关联数组时遇到了麻烦。所以基本上是一堆多维数组中的多维数组中的多维数组..... 这有点麻烦,因为我不能用手做。我需要一种自动化的方式来处理一堆字符串。我认为以下示例将更好地解释它:
//string i want to enter
$string = 'ADAM';
//array i want to end up with
$result = array
(
'A'=> array
(
'D'=>array
(
'A'=>array
(
'M'=>array
(
'result'=>'ADAM'
)
)
)
)
)
我最初的方法只是使用 if 条件将第一个 Char 作为数组插入到主数组中,例如:
for($i = 0; $i < strlen($string); $i++){
if($i == 0){
$array1[$word[$i]] = array();
}
}
效果很好。但后来我 运行 进入我的问题:我如何跟踪数组中的当前点? 在 if 检查之后,我会选择一个 else 语句,该语句在 $i 大于 0 时起作用。但是如果我想插入数组的下一个维度,在这种情况下为 'D',我需要到 select $array1['A'],下一个我需要 $array1['A']['D'] 等等。我还没找到办法要做到这一点。我需要进入这个数组的字符串从 4-70 个字符不等。 我知道的每种方法都只改变了二维,所以我最终得到:
$array1('A'=>array ('A' =>array()));
$array1('A'=>array ('D' =>array()));
$array1('A'=>array ('A' =>array()));
$array1('A'=>array ('M' =>array()));
或者索引本身是数组导致的非法偏移错误。 也许我在这里的方法是不可能的,但我仍然认为我可能会问以防万一我遗漏了什么。
在后期,我希望对所有字符串使用相同的数组,所以我基本上使用字符作为节点。如果 'A' 作为第一个字符已经存在,我将跳过它并插入第二个字符将下一个字符串放入 'A'-Array 等
提前致谢!
您可以使用引用,以便在遍历字符串时将下一个字符添加为数组的键,然后将此新条目设置为循环中下一个操作的添加点...
$string = 'ADAM';
$result = [];
$add = &$result;
for($i = 0; $i < strlen($string); $i++){
$add = &$add[$string[$i]];
}
$add['result'] = $string;
print_r($result);
只是为了说明如何添加多个条目...
addEntry ( $result, "ADAM");
addEntry ( $result, "ALAN");
addEntry ( $result, "ADAME");
function addEntry ( &$result, string $newValue ) {
for($i = 0; $i < strlen($newValue); $i++){
$result = &$result[$newValue[$i]];
}
$result['result'] = $newValue;
}
结果...
Array
(
[A] => Array
(
[D] => Array
(
[A] => Array
(
[M] => Array
(
[result] => ADAM
[E] => Array
(
[result] => ADAME
)
)
)
)
[L] => Array
(
[A] => Array
(
[N] => Array
(
[result] => ALAN
)
)
)
)
)
您可以为此使用递归函数。
function nest(string $str, int $i = 0) {
return isset($str[$i]) ? [$str[$i] => nest($str, $i + 1)] : ['result' => $str];
}
$result = nest($string);
这是您要实现的目标的解决方案。查看有效的解决方案 here,并附上说明其有效的评论。
$val = 'ADAM';
$arr = [];
$keys = str_split($val);
$curr = &$arr;
foreach($keys as $key) {
$curr = &$curr[$key];
}
$curr = ['result' => $val];
print_r($arr);