将标题的第一个字母添加到数组中,然后比较数组

时间:2018-05-18 作者:dSumner.1289

我有一个自定义帖子叫做foundation_firms, 我想从中创建一个字母数组,每个字母表示存在一个以该字母开头的帖子。

我一直想用in_array() 为了避免在数组中已经存在字母的情况下向数组中添加字母,但是这种方法对我不起作用。有人知道为什么吗?以下是我目前的代码:

$alphas = range(\'A\', \'Z\');
$post_alphas = [];
$post_args = array(
    \'post_type\' => \'foundation_firms\',
    \'post_status\' => \'publish\',
    \'order\' => \'ASC\',
    \'posts_per_page\' => -1,
    \'orderby\' => \'title\',
);
$firm_query = new WP_Query($post_args);
if($firm_query->have_posts()){
    while($firm_query->have_posts()){
        $firm_query-> the_post();
        $title = get_the_title();
        echo $title.\'<br/>\';
        $title_alpha = $title[0];
        if(!in_array($post_alphas, $title_alpha)){
            $post_alphas[] = $title_alpha;
        }
    }
}
$final_alpha = array_intersect($post_alphas, $alphas);
echo \'<pre>\'.var_dump($final_alpha).\'</pre>\';
基本上,这只是给我一个数组,每个帖子的第一个字母,重复和所有。不是吗in_array() 应该消除这个功能吗?

提前感谢这里的所有接受者。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

的论点in_array() 都是错误的方向。查看documentation 可以看到,第一个参数是要检查的值(“针”),第二个参数是要在其中检查的数组(“干草堆”)。

所以这意味着它总是评估为false, 这意味着条件中的代码每次都在运行。

只需交换参数即可解决问题:

if( ! in_array( $title_alpha, $post_alphas ) ) {
    $post_alphas[] = $title_alpha;
}
不过,有一种(我认为)更简洁的方法可以做到这一点,只需少量代码。您可以先获取帖子,然后使用array_map() 将数组中的每个值仅替换为每个标题的第一个字母。然后最后array_unique() 要删除重复项,请执行以下操作:

$posts = get_posts( array(
    \'post_type\'      => \'foundation_firms\',
    \'post_status\'    => \'publish\',
    \'order\'          => \'ASC\',
    \'posts_per_page\' => -1,
    \'orderby\'        => \'title\',
) );

$letters = array_map( $posts, function( $post ) {
    return $post->post_title[0];
} );

$letters_unique = array_unique( $letters );

结束