按内部 HTML 对超链接数组进行排序
Sort array of hyperlinks by inner HTML
我有一个这样的数组:
array(6) { [0]=> string(116) "A" [1]=> string(112) "C" [2]=> string(110) "B" [3]=> string(115) "F" [4]=> string(113) "D" [5]=> string(112) "E" }
哪个字母代表超链接,所以每个字母是:
<a href="link">Letter</a>
我想对这个数组进行排序,所以我按 letter/innerHTML
对它进行了排序
我想在回显之前对此进行排序。
任何帮助将不胜感激。
谢谢
您可以拆分 link 并使用字母作为键并使用完整的 link 作为值创建新的关联数组。试试下面的代码。
$links=['<a href="link">D</a>','<a href="link">B</a>','<a href="link">C</a>','<a href="link">A</a>'];
$new_links=[];
foreach($links as $link){
$array_1= explode(">",$link);
$array_2 = explode("<",$array_1[1]);
$new_links[$array_2[0]]=$link;
}
ksort($new_links);
您可以 usort
使用仅比较 link 文本的回调。
$link = '/.+>(.+)<.+/';
usort($array, function($a, $b) use ($link) {
return preg_replace($link, '', $a) <=> preg_replace($link, '', $b);
// If you're on PHP 5 without the <=> operator, you can use strcmp instead
// return strcmp(preg_replace($link, '', $a), preg_replace($link, '', $b));
});
我不是正则表达式专家,所以可能有更好的方式来编写模式,但总体思路是一样的。众所周知,用正则表达式解析任意 HTML 不是一个好主意,但对于像 <a>
标签数组这样的东西,它似乎很 har̴ml´es͝s。
我建议使用 strip_tags() 并对结果进行排序,但如果您想保留多个 link 实例,则需要使用多维数组并对其进行排序:
$unsortedArray = [
'<a href="/orange">Orange</a>',
'<a href="/banana2">Banana</a>',
'<a href="/apple">Apple</a>',
'<a href="/pineapple">pineapple</a>',
'<a href="/banana">Banana</a>',
'<a href="/apple">Apple 2</a>',
];
$sortedArray = [];
function sortLinks($links) {
$splitArray = [];
$sortedArray = [];
foreach($links as $link) {
$label = strip_tags($link);
$splitArray[] = ['link' => $link, 'label' => $label];
}
usort($splitArray, function ($a, $b) {
return $a['label'] <=> $b['label'];
});
foreach ($splitArray as $item) {
$sortedArray[] = $item['link'];
}
return $sortedArray;
}
$sorted = sortLinks($unsortedArray);
echo '<pre>' . print_r($sorted, 1) . '</pre>';
输出应该是:
Array
(
[0] => Apple
[1] => Apple 2
[2] => Banana
[3] => Banana
[4] => Orange
[5] => pineapple
)
我有一个这样的数组:
array(6) { [0]=> string(116) "A" [1]=> string(112) "C" [2]=> string(110) "B" [3]=> string(115) "F" [4]=> string(113) "D" [5]=> string(112) "E" }
哪个字母代表超链接,所以每个字母是:
<a href="link">Letter</a>
我想对这个数组进行排序,所以我按 letter/innerHTML
对它进行了排序我想在回显之前对此进行排序。
任何帮助将不胜感激。
谢谢
您可以拆分 link 并使用字母作为键并使用完整的 link 作为值创建新的关联数组。试试下面的代码。
$links=['<a href="link">D</a>','<a href="link">B</a>','<a href="link">C</a>','<a href="link">A</a>'];
$new_links=[];
foreach($links as $link){
$array_1= explode(">",$link);
$array_2 = explode("<",$array_1[1]);
$new_links[$array_2[0]]=$link;
}
ksort($new_links);
您可以 usort
使用仅比较 link 文本的回调。
$link = '/.+>(.+)<.+/';
usort($array, function($a, $b) use ($link) {
return preg_replace($link, '', $a) <=> preg_replace($link, '', $b);
// If you're on PHP 5 without the <=> operator, you can use strcmp instead
// return strcmp(preg_replace($link, '', $a), preg_replace($link, '', $b));
});
我不是正则表达式专家,所以可能有更好的方式来编写模式,但总体思路是一样的。众所周知,用正则表达式解析任意 HTML 不是一个好主意,但对于像 <a>
标签数组这样的东西,它似乎很 har̴ml´es͝s。
我建议使用 strip_tags() 并对结果进行排序,但如果您想保留多个 link 实例,则需要使用多维数组并对其进行排序:
$unsortedArray = [
'<a href="/orange">Orange</a>',
'<a href="/banana2">Banana</a>',
'<a href="/apple">Apple</a>',
'<a href="/pineapple">pineapple</a>',
'<a href="/banana">Banana</a>',
'<a href="/apple">Apple 2</a>',
];
$sortedArray = [];
function sortLinks($links) {
$splitArray = [];
$sortedArray = [];
foreach($links as $link) {
$label = strip_tags($link);
$splitArray[] = ['link' => $link, 'label' => $label];
}
usort($splitArray, function ($a, $b) {
return $a['label'] <=> $b['label'];
});
foreach ($splitArray as $item) {
$sortedArray[] = $item['link'];
}
return $sortedArray;
}
$sorted = sortLinks($unsortedArray);
echo '<pre>' . print_r($sorted, 1) . '</pre>';
输出应该是:
Array
(
[0] => Apple
[1] => Apple 2
[2] => Banana
[3] => Banana
[4] => Orange
[5] => pineapple
)