使用 usort 函数分组
Grouping with usort function
我需要对标签进行排序。每个标签看起来像这样 "Firstname Lastname (University)"。
我希望名字按大学排序,然后像这样回显:
大学1:
名字 1 姓氏 1(大学 1)
名字 2 姓氏 2(大学 1)
等等
大学2:
名 3 姓 3(大学 2)
名 4 姓 4(大学 2)
等等
大学3:
名 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>';
您可以使用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>';
我需要对标签进行排序。每个标签看起来像这样 "Firstname Lastname (University)"。 我希望名字按大学排序,然后像这样回显:
大学1:
名字 1 姓氏 1(大学 1)
名字 2 姓氏 2(大学 1)
等等
大学2:
名 3 姓 3(大学 2)
名 4 姓 4(大学 2)
等等
大学3:
名 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>';
您可以使用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>';