我有一个这样的字符串:Indoformosa/Folder1/SubFolder1
,并且使用这些字符串将为面包屑URL生成一个数组。该应用程序需要数组格式,如下所示:
[
0 => [
'label' => 'Indoformosa'
'url' => 'Indoformosa'
]
1 => [
'label' => 'Folder1'
'url' => 'Indoformosa/Folder1'
]
2 => [
'label' => 'SubFolder1'
'url' => 'Indoformosa/Folder1/SubFolder1'
]
]
到目前为止,我的PHP代码看起来像这样:
$queryParamsPath = 'Indoformosa/Folder1/SubFolder1'
$links = explode('/', $queryParamsPath);
$links = array_map(function ($el) {
return [
'label' => $el,
'url' => Url::to($el)
];
}, $links);
输出如下所示:
[
0 => [
'label' => 'Indoformosa'
'url' => 'Indoformosa'
]
1 => [
'label' => 'Folder1'
'url' => 'Folder1'
]
2 => [
'label' => 'SubFolder1'
'url' => 'SubFolder1'
]
]
你其实很接近。我稍微更改了您的代码以使用更多标准语言元素:
<?php
$queryParamsPath = 'Indoformosa/Folder1/SubFolder1';
$parts = explode('/', $queryParamsPath);
$links = [];
$path = '';
foreach ($parts as $part) {
$links[] = [
'label' => $part,
'url' => $path . $part,
];
$path .= $part . '/';
}
print_r($links);
您可能希望将其放在函数中,以将变量与全局范围隔离。
您可以在此处查看工作代码:https://3v4l.org/Y6dSc
一个简单的解决方法是引入一个额外的数组,您可以在其中"持有"到 url,并在每次迭代时附加下一部分:
<?php
$queryParamsPath = 'Indoformosa/Folder1/SubFolder1';
$links = explode('/', $queryParamsPath);
$hold = [];
$links = array_map(function ($el) use (&$hold) {
$hold[] = $el;
return [
'label' => $el,
'url' => implode($hold, '/')
];
}, $links);
在线试用!
更动态的修复将使用array_reduce()
,您可以使用carry
获取"最后一个"url
,并将当前url
附加到其中,如果不是第一个,则在两者之间加/
:
<?php
$queryParamsPath = 'Indoformosa/Folder1/SubFolder1';
$links = explode('/', $queryParamsPath);
$links = array_reduce($links, function($c, $i) {
$existingUrls = $c[count($c) - 1]['url'] ?? '';
$existingUrls .= ($existingUrls) ? ('/' . $i) : $i;
$c[] = [
'label' => $i,
'url' => $existingUrls
];
return $c;
}, []);
在线试用!
两者都提供以下输出:
array(3) {
[0]=>
array(2) {
["label"]=>
string(11) "Indoformosa"
["url"]=>
string(11) "Indoformosa"
}
[1]=>
array(2) {
["label"]=>
string(7) "Folder1"
["url"]=>
string(19) "Indoformosa/Folder1"
}
[2]=>
array(2) {
["label"]=>
string(10) "SubFolder1"
["url"]=>
string(30) "Indoformosa/Folder1/SubFolder1"
}
}