使用 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>';