【问题标题】:String to variable-depth multidimensional array字符串到可变深度多维数组
【发布时间】:2010-08-02 11:57:09
【问题描述】:

我正在尝试从一个字符串创建一个多维数组(从 $_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'
       )
  )
);

【问题讨论】:

  • 为什么不完全摆脱这种解析,而是发送一个数组本身呢?当然是序列化或 json_encoded
  • 数据需要使用 1x1 图像从 3rd 方站点捕获。所以我需要使用较小的变量来做到这一点。不过,如果它符合我的要求,我可能会接受 cHao 的数组建议。

标签: php multidimensional-array


【解决方案1】:

这样的事情应该可以工作:

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

我所做的就是像你一样炸掉你的钥匙。然后,如果该数组尚不存在,我将遍历它们创建一个新数组。使用参考我保存了我在数组中的当前点。然后,一旦我按下最后一个键,我就分配了值。希望这会有所帮助。

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

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

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

以防止 foreach 失败。

编辑 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'
);

【讨论】:

  • 非常好!我有同样的事情。怕你打我一拳。现在发布我的解决方案毫无意义...... ;) 无论如何 gj
  • 我在想$keys = 行,最后,: $key; 应该是: array($key);。这样 ?: 的两个分支都返回一个数组。
【解决方案2】:

您知道,PHP 可以接受这样的整个大数组。如果您将表单元素命名为“somename[page][title]”,那么当表单返回时,您应该会看到它们已经在 $_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】:
    <?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);
    ?>
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-18
      • 2017-07-08
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多