【发布时间】:2023-03-14 07:23:01
【问题描述】:
我正在为一些数组的东西而苦苦挣扎。我有一个函数arr_set(),我可以在其中传递一个数组、一个键和一个值(例如,在键“sub.key”上设置一个值“value”,这将创建$array["sub"]["key"],其值为“value”。
我也可以直接设置一个数组($key 将是值,而$value 为空)并分配它 - 也可以,但其中有一个小错误,因为它不会拆分点标记的键放在某个子数组中。
检查代码:
/**
* Function to set the data
*
* @param $array
* @param $key
* @param null $value
*/
function arr_set(&$array, $key, $value = null) {
if ($key === null) {
$array[] = $value;
return;
}
if (is_array($key)) {
foreach ($key as $k => $v) {
arr_set($array, $k, $v);
}
return;
}
$temp = &$array;
$key = (string)$key;
$keys = explode(".", $key);
foreach ($keys as $k) {
if ((is_array($temp) && !array_key_exists($k, $temp)) || !is_array($temp[$k])) {
$temp[$k] = [];
}
$temp = &$temp[$k];
}
$temp = $value;
}
$temp = [
"live" => [
"db.name" => "livedb",
"db" => [
"host" => "localhost",
],
],
];
# Original array
$myArray = [];
# Set the $temp to the $myArray
arr_set($myArray, $temp);
echo "<pre>" . print_r($myArray, true) . "</pre>";
结果是
Array
(
[live] => Array
(
[db.name] => livedb
[db] => Array
(
[host] => localhost
)
)
)
几乎,但不是很完美——你看到“db.name”键了吗?这实际上不应该存在,而是键“db”应该具有与“host”相同级别的子键“name”。希望我提供了足够的信息以使问题易于理解。 思考如何解决这个小错误以某种方式使我的大脑崩溃,我得出的结论是,如果有解决方案,它将导致超级混乱,蹩脚,骇人听闻的无性能代码。希望不会,但我放弃了这一点^^
我用谷歌搜索并搜索了很多,但找不到任何可行的解决方案。这个库https://github.com/adbario/php-dot-notation 做不到,laravel 的array_set() 也做不到。有什么想法吗?
(PS: sry for bad English, German here)
【问题讨论】:
-
看来
$myArray = [ "key" => "value", ];可以完全从您的问题中删除(只需在您的过程中稍后将其与递归结果合并。 -
@mickmackusa 当然,但这不是我的问题的重点。
-
没错,我们需要隔离您的需求,并从您的问题中删除多余的部分。
-
我认为你的问题不值得投票,所以我现在就投票。也就是说,请不要认为此页面“已完成”。每个页面都应该得到系统认可的分辨率。如果您已经解决了自己的问题,请将其作为答案发布,并附上解释,旨在让未来的研究人员了解它的工作原理、可能无法解决的任何边缘案例以及为什么它是一个好的解决方案。用
SOLVED标记你的标题并不是这里的事情。请从您的问题中清除任何不必要的文本——内容最少时最好。 -
请发布您的答案,当足够的时间过去后,您将能够用绿色勾号标记它。如果其他人出现并提供了更好的解决方案,您可以根据需要移动绿色对勾(标记其他志愿者的答案将获得 5 个代表点数)。