Группировка с помощью функции usort
Мне нужно отсортировать теги. Каждый тег выглядит так: "Имя, Фамилия (Университет)". Я хочу, чтобы имена сортировались по университетам, а затем отражались так:
университета1:
Имя1 Фамилия1 (Университет1)
Имя2 Фамилия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>';
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, вы можете использовать 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>';