【问题标题】:PHP multidimensional array key collapsePHP多维数组键折叠
【发布时间】:2013-05-21 15:42:46
【问题描述】:

我想折叠一个多维数组,以便

$arr = array(
    'first' => array(
        'second' => array(
            0 => 'foo',
            1 => 'bar'
        )
    )
);

会折叠到

$arr = array(
    'first[second][0]' => 'foo',
    'first[second][1]' => 'bar'
);

我要做的是将multipart/form-data $_POST 数组恢复到原始请求正文,如下所示:

------WebKitFormBoundaryxiOccKlMg4Al6VbH
Content-Disposition: form-data; name="first[second][0]"

foo
------WebKitFormBoundaryxiOccKlMg4Al6VbH
Content-Disposition: form-data; name="first[second][1]"

bar
------WebKitFormBoundaryxiOccKlMg4Al6VbH--

【问题讨论】:

  • 扩展例子,通过这个例子你的问题很模糊!也放上你的作品和你到目前为止所做的事情。

标签: php multidimensional-array httprequest multipartform-data


【解决方案1】:

试试这个代码:

$arr = array(
    'first' => array(
        'second' => array(
            0 => 'foo',
            1 => 'bar'
        )
    )
);
$result = array();
function processLevel(&$result, $source, $previous_key = null) {
    foreach ($source as $k => $value) {
        $key = $previous_key ? "{$previous_key}[{$k}]" : $k;
        if (!is_array($value)) {
            $result[$key] = $value;
        } else {
            processLevel($result, $value, $key);
        }
    }
}
processLevel($result, $arr);
var_dump($result);
die();

它输出:

array(2) {
  ["first[second][0]"] => string(3) "foo"
  ["first[second][1]"] => string(3) "bar"

}

【讨论】:

  • 请使用更多不言自明的变量名,以便我们更容易知道发生了什么;-)
  • 我试图尽快写出来,成为第一个发布答案的人)
  • 那现在就改吧,你不被禁止编辑...(是的,你是第一个,我的回答是 6-7 秒后^^)
  • 混淆代码看起来会更糟:-P 我仍然明白发生了什么,但它不适合复制粘贴...
  • 非常令人印象深刻的@BogdanBurim,这正是我想要实现的目标,简单明了!
【解决方案2】:

这个呢?

$arr = array(
    'first' => array(
        'second' => array(
            0 => 'foo',
            1 => 'bar'
        )
    )
);
$newArray=array();
foreach($arr['first']['second'] as $k=>$v)
{
    $newArray['first[second]['.$k.']']=$v;
}

var_dump($arr);
var_dump($newArray);

我希望这会有所帮助。

【讨论】:

  • @BogdanBurim:有什么关于通用解决方案的说法吗?
  • 很明显应该是通用的,也很明显他提供的数组是sample。
  • 哈尔科夫你好。
  • @BogdanBurim:没有提到数组可以包含first 或second 级别的许多键。好像只能调整整数键的级别
  • @BogdanBurim:哈尔科夫你好 :)
【解决方案3】:
function collapseArray ($array, $tree = array(), $step = 0) {
    $result = array();
    foreach ($array as $key => $val) {
        $tree[$step] = $key;
        if (is_scalar($val)) {
            $first = array_shift($tree);
            $result["{$first}[".implode("][", $tree)."]"] = $val;
            array_unshift($tree, $first);
        } else {
            $result += collapseArray($val, $tree, $step + 1);
        }
    }
    return $result;
}

$arr = array(
    'first' => array(
        'second' => array(
            0 => 'foo',
            1 => 'bar'
        )
    )
);

$newArray = collapseArray($arr);

var_dump()'ed 时的输出:

array(2) {
  ["first[second][0]"]=>
  string(3) "foo"
  ["first[second][1]"]=>
  string(3) "bar"
}

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2011-09-20
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2013-11-27
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多