【问题标题】:Generate dynamic array from exploded string [closed]从分解的字符串生成动态数组[关闭]
【发布时间】:2012-01-24 20:01:20
【问题描述】:

我有一个格式如下的字符串数组:

$strings = array(
   "/user",
   "/robot",
   "/user/1",
   "/user/2",
   "/user/2/test",
   "/robot/1"
);

当我print_r()它时,我需要做的是把它变成如下结构的数组:

Array
(
  [user] => Array (
    [1] => array(),
    [2] => Array (
      [test] => array()
    )
  [robot] => Array (
      [1] => array()
    )
)

我知道我需要通过分隔符 / 分解原始字符串。但是我的问题是如何构建动态数组。

请注意,字符串可能有无限数量的斜杠。

【问题讨论】:

  • 递归思考。例如,您可以将每个原始元素分解一次,然后将分解后的数组传递给一个函数,该函数将沿着树向下导航,直到到达分解数组的最后一个元素,此时它将插入该元素。
  • 仅供参考,我猜这被否决了,因为它是一个"gimme teh codez" 问题。

标签: php arrays string explode


【解决方案1】:

您可以在遍历列表时使用引用逐步构建数组。

$strings = array(
   "/user",
   "/robot",
   "/user/1",
   "/user/2",
   "/user/2/test",
   "/robot/1"
);

$extracted = array();

foreach( $strings as $string )
{
  $pos =& $extracted;
  foreach( explode('/', ltrim($string, '/')) as $split )
  {
    if( ! isset($pos[$split]) )
    {
      $pos[$split] = array();
    }

    $pos =& $pos[$split];
  }
}

print_r($extracted);

此代码可能无法很好地处理空元素(例如,/user//4//////test),具体取决于您的要求。

【讨论】:

  • 不错,同一时间发帖,解法一模一样……加油凤凰
  • @MathieuDumoulin Yours 有一个很好的解释,两种方法之间存在一些差异,希望至少能让 OP 有机会从这个小练习中学到一些东西。你也得到了我的 +1 (:
【解决方案2】:

下面的代码应该会给你你正在寻找或非常接近的东西......

$result = array();
foreach($strings as $string){

    $exploded = explode('/', substr($string, 1));
    $path = &$result;

    foreach($exploded as $explodedpart){
        if(!array_key_exists($explodedpart, $path)){
            $path[$explodedpart] = array();
        }
        $path = &$path[$explodedpart];
    }
}

初始化数组,然后循环所有字符串并在 / 上分解它们(删除第一个)。然后,设置对结果数组第一级的初始引用。请注意 &,在此算法中保持运行至关重要。

然后,循环您分解的字符串的每个部分,检查该部分是否作为当前 $path 中的键存在,该键链接到我们所在的当前步骤。在每个循环中,我们创建缺少的键并将其初始化为 array(),然后获取该新数组并使用引用将其保存为新的 $path...

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2021-11-29
    • 1970-01-01
    • 2018-05-23
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多