Группировка с помощью функции 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>';
Другие вопросы по тегам