百思不得其解: PHP 怎么把一维数组的键值转化为多维数组的键名

2022-01-12 15:44:36 +08:00
 tellmeworld

比如$arr=array('a','b','c','d'); 长度不固定;

要变成$arr['a']['b']['c']['d'], 按照顺序的;

请问有啥办法?

1728 次点击
所在节点    程序员
14 条回复
dajj
2022-01-12 15:52:11 +08:00
太简单了, 你再想想
FaceBug
2022-01-12 15:52:26 +08:00
那你的值是什么呢? null ?
tellmeworld
2022-01-12 15:57:05 +08:00
@FaceBug 后续有判断的,是判断如果一维数组$arr 不为空,就变成多维数组,并赋值一个特定的数给它。
BJL
2022-01-12 16:00:45 +08:00
$src = ['a','b','c','d'];

$output_v = "";

for($i = count($src) - 1;$i >= 0;$i--){
$v = $src[$i];
$v_prev = $src[$i + 1] ?? "";
$output[$v] = $output ?? $output_v;
unset($output[$v_prev]);
}
echo json_encode($output);
tellmeworld
2022-01-12 16:01:55 +08:00
厉害,我刚想到可能先转化为 json 字符串形式,然后再转换,你已经写好了
q792602257
2022-01-12 16:03:03 +08:00
仅供参考
```php
/**
* @var string[] 必须是能作为数组键的值
*/
$arr = array("a", "b", "c", "d", "e");
$newArr = array();
// 引用新的数组
$newArrPointer = &$newArr;
while (sizeof($arr) > 0) {
// 移出第一个元素,作为键名
$key = array_shift($arr);
// 对上一个引用,做修改操作
$newArrPointer[$key] = array();
// 重新引用新的数组
$newArrPointer = &$newArrPointer[$key];
}
// 如果需要赋值,在这里赋值
$newArrPointer = 777;
// 释放引用
unset($newArrPointer);
print_r($newArr);
```
BJL
2022-01-12 16:06:12 +08:00
@tellmeworld 楼上那个比较好
FaceBug
2022-01-12 16:24:24 +08:00
@tellmeworld 是我理解错了

不过这和 json 有什么关系
justrand
2022-01-12 16:36:35 +08:00
@tellmeworld 你需要的结果是这样的?
~~~php
array(1) {
["a"]=>
array(1) {
["b"]=>
array(1) {
["c"]=>
array(1) {
["d"]=>
array(1) {
["e"]=>
int(777)
}
}
}
}
}
FaceBug
2022-01-12 16:38:43 +08:00
$src = ['a', 'b', 'c', 'd'];
$output = "";
while (count($src) > 0) {
$tmp = [];
$output = $tmp[array_pop($src)] = $output;
$output = $tmp;
}
print_r($output);
ntuwang
2022-01-13 10:30:27 +08:00
你头像有政治错误啊,湾湾木了啊
totoro52
2022-01-13 11:48:55 +08:00
换个头像吧 你这头像肯定是青蛙画的
houshengzi
2022-01-13 20:25:34 +08:00
内置函数,array_fill_keys 应该可以满足到
RickyC
2022-01-14 11:00:03 +08:00
```
public function test()
{
//原数组
$arr1 = ['a', 'b', 'c', 'd'];

//结果数组
$arr2 = [];

//初始化指针
$tmp = &$arr2;

foreach ($arr1 as $value) {
//将 value 转化为键
$tmp[$value] = [];

//更新指针
$tmp = &$tmp[$value];
}

//查看结果
echo '<pre>';
var_dump($arr2);
}
```

不知道对不对

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX