【问题标题】:Grouping with usort function使用 usort 函数进行分组
【发布时间】:2018-02-18 11:06:11
【问题描述】:

我需要对标签进行排序。每个标签看起来像这样“名字姓氏(大学)”。 我希望按大学对名称进行排序,然后像这样回应:

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

【问题讨论】:

    标签: php wordpress sorting grouping usort


    【解决方案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>';
    

    【讨论】:

    • 非常感谢您的回答!这很好用,唯一的问题是名称不是固定的,所有标签都是通过 wordpress 添加的。这意味着我需要类似: $tags = array( [在此处调用所有标签的动态方式] );我尝试使用 get_tags 但似乎无法使其工作。再次感谢!
    • 哦..我以为你的问题是对标签进行分组。我假设你已经有了标签。你能得到get_tags的标签吗?
    • 根据wordpress doc,developer.wordpress.org/reference/functions/get_the_tags你可以使用get_the_tags();
    • 好的,我会处理的。非常感谢您的帮助,但我相信我会解决的!谢谢x1000
    • 哦,$tags = get_tags(array('hide_empty' => false, 'order'=>'ASC'));作品! :))))) 再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多