代码之家  ›  专栏  ›  技术社区  ›  Mads Mogenshøj

字符串到可变深度多维数组

  •  1
  • Mads Mogenshøj  · 技术社区  · 14 年前

    我正在尝试从字符串创建多维数组(从$\u 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'
           )
      )
    );
    
    3 回复  |  直到 14 年前
        1
  •  4
  •   Ian Burris    14 年前

    这样的方法应该有效:

    <?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);
    

    我所做的就是像你一样引爆你的钥匙。然后,我在它们之间循环,创建一个新的数组(如果数组还不存在的话)。使用引用保存数组中的当前点。一旦我按下最后一个键,我就分配了这个值。希望这有帮助。

    编辑: 根据曹的建议,我改变了

    $keys = strpos($key, '-') !== false ? explode('-', $key) : $key;
    

    $keys = strpos($key, '-') !== false ? explode('-', $key) : array($key);
    

    防止前臂失效。

    编辑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'
    );
    
        2
  •  1
  •   cHao    14 年前

    正如您所知道的,可以让PHP接受这样的大数组。如果您将表单元素命名为'somename[page][title]',那么当表单返回时,您应该会看到它们已经在$\u 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;
    }
    
        3
  •  0
  •   harpax    14 年前
    <?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);
    ?>
    

    希望有所帮助