【问题标题】:Searching for a way to construct a multidimensional, multilayered, associative Array寻找构建多维、多层、关联数组的方法
【发布时间】:2020-06-19 09:02:12
【问题描述】:

所以我在遍历字符串并将其字符作为索引数组插入到多维关联数组时遇到了麻烦。所以基本上是一堆多维数组中的多维数组中的多维数组...... 这有点麻烦,因为我不能手动完成。我需要一种自动化的方法来用一堆字符串来做到这一点。我认为下面的例子会更好地解释它:

//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-check 之后,我会选择一个 else 语句,当 $i 大于 0 时起作用。但是如果我想插入数组的下一个维度,在这种情况下是 'D',我需要选择$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等。

提前致谢!

【问题讨论】:

  • 没关系,别担心。我会在星期一尝试推荐的解决方案,肯定会有很多好死的!

标签: php arrays multidimensional-array associative-array


【解决方案1】:

您可以使用引用,以便在遍历字符串时将下一个字符作为键添加到数组中,然后将此新条目设置为循环中下一个操作的添加点...

$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
                                )

                        )

                )

        )

)

【讨论】:

  • 啊,我完全忘记了参考。像这样有道理,难怪我得到未定义的索引错误。这就是我缺乏经验的地方,有时嘿嘿
【解决方案2】:

这是您想要实现的目标的解决方案。请参阅带有 cmets 的工作解决方案 here 来解释它的工作原理。

$val = 'ADAM';
$arr = [];
$keys = str_split($val);
$curr = &$arr;
foreach($keys as $key) {
    $curr = &$curr[$key];
}
$curr = ['result' => $val];

print_r($arr);

【讨论】:

  • 有趣的解决方案。我不知道 str_split 函数。
【解决方案3】:

您可以为此使用递归函数。

function nest(string $str, int $i = 0) {
    return isset($str[$i]) ? [$str[$i] => nest($str, $i + 1)] : ['result' => $str];
}

$result = nest($string);

【讨论】:

  • 这绝对是最好的方法。您可能需要记下有关使用 array_merge_recursive($result, nest($string2)); 向数组添加新单词的说明。
  • @NigelRen 我只是认为递归是解决生成任意深度结果问题的最自然方法。对我来说,当我查看这段代码时,很明显在底部添加了result 元素,然后当你展开递归时,你推送前一个字母直到你回到开头。话虽如此,这绝对是个人喜好,您和 Omar 的方法是完全有效的 - 我只是发现阅读该代码并理解正在发生的事情要困难得多。
  • @NigelRen 你对递归的开销是正确的,但是向数组添加新单词的开销(正如 OP 在他们的最后一段中描述的那样) - 我建议使用 array_merge_recursive - 将是两种方法都一样——除非你有更好的方法?
  • 这绝对完美无瑕,我明白这里发生了什么。还要@Nick 感谢您的提示。我在带有字符串数组的 foreach 循环中添加了 array_merge_recursive 语句,它工作得很好
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多