我需要对标签进行排序。每个标签都是这样的"名字姓氏(大学)"。 我希望这些名字按大学排序,然后像这样回应:
University1:
名字1姓氏1(大学1)
Firstname2姓氏2(大学1)
等
University2:
名字3姓氏3(大学2)
名字4姓氏4(大学2)
等
University3:
名字5姓氏5(大学3)
名字6姓氏6(大学3)
等
我设法对它们进行排序,然后回显整个列表,但我无法弄清楚如何对结果进行分组。
这是我的代码:
function compareUniversity($a, $b) {
$matchA = [];
$matchB = [];
preg_match('/\(([\w]+)\)/', $a->name, $matchA);
preg_match('/\(([\w]+)\)/', $b->name, $matchB);
$aUniversity = $matchA[1];
$bUniversity = $matchB[1];
return strcmp($aUniversity, $bUniversity);
};
usort($tags, "compareUniversity");
echo '<ul>';
foreach ($tags as $tag) {
$term = $tag->term_id;
$st= 'post_tag_'.$term;
$link = get_field('url',$st, true);
echo '<li><a href="http://'.$link.'" target="_blank">' . $tag->name . '</a></li>';
}
echo '</ul>';
答案 0 :(得分:1)
您可以使用array_reduce
对数组进行分组。
//Sample array
$tags = array(
'Firstname1 Lastname1 (University1)',
'Firstname2 Lastname2 (University1)',
'Firstname3 Lastname3 (University2)',
'Firstname4 Lastname4 (University2)',
'Firstname5 Lastname5 (University3)',
'Firstname6 Lastname6 (University3)'
);
//Group array
$orderedTags = array_reduce($tags, function($c, $v){
preg_match('/\(([\w]+)\)/', $v, $u);
$c[ $u[1] ][] = $v;
return $c;
}, array());
//Print Grouped array
echo '<ul>';
foreach( $orderedTags as $key => $orderedTag ) {
echo "<li>" . $key . "</li>";
//Loop each tags
echo "<li>";
echo '<ul>';
foreach( $orderedTag as $item ) {
echo "<li>" . $item . "</li>";
}
echo '</ul>';
echo "</li>";
}
echo '</ul>';
这将导致:
<ul>
<li>University1</li>
<li>
<ul>
<li>Firstname1 Lastname1 (University1)</li>
<li>Firstname2 Lastname2 (University1)</li>
</ul>
</li>
<li>University2</li>
<li>
<ul>
<li>Firstname3 Lastname3 (University2)</li>
<li>Firstname4 Lastname4 (University2)</li>
</ul>
</li>
<li>University3</li>
<li>
<ul>
<li>Firstname5 Lastname5 (University3)</li>
<li>Firstname6 Lastname6 (University3)</li>
</ul>
</li>
</ul>
根据Wordpress doc,您可以使用get_the_tags();
来获取代码。
注意:这不是在wordpress上测试的。如果有效,请告诉我。
$tags = get_the_tags($post->ID); //Get tag from wordpress
//Try to print_r
echo "<pre>";
print_r( $tags );
echo "</pre>";
//Group array
$orderedTags = array_reduce($tags, function($c, $v){
$v = $v->name;
preg_match('/\(([\w]+)\)/', $v, $u);
$c[ $u[1] ][] = $v;
return $c;
}, array());
//Print Grouped array
echo '<ul>';
foreach( $orderedTags as $key => $orderedTag ) {
echo "<li>" . $key . "</li>";
//Loop each tags
echo "<li>";
echo '<ul>';
foreach( $orderedTag as $item ) {
echo "<li>" . $item . "</li>";
}
echo '</ul>';
echo "</li>";
}
echo '</ul>';