使用usort功能进行分组

时间:2018-02-18 11:06:12

标签: php wordpress sorting grouping usort

我需要对标签进行排序。每个标签都是这样的"名字姓氏(大学)"。 我希望这些名字按大学排序,然后像这样回应:

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

1 个答案:

答案 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>';