PHP - 从字符串生成路径 URL

  • 本文关键字:路径 URL 字符串 PHP php
  • 更新时间 :
  • 英文 :


我有一个这样的字符串: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"
}
}

最新更新