查找数组中最接近的值

时间:2016-02-24 21:57:08

标签: php wordpress sorting

希望有人可以提供帮助,我正在为竞赛做准备 - 用户可以猜测逃避现实主义者执行某个行为所需的时间,因此您将拥有以下情形: / p>

法案1 - 逃避学家在2分30秒内完成

假设您有5个猜测:

姓名1:1分20

姓名2:2分钟20

姓名3:5分50

姓名4:6分10

姓名5:3分40

当逃避现实主义者完成后,他们希望能够显示前四名的结果,所以在这种情况下它将是:

姓名2:2分钟20

姓名1:1分20

姓名5:3分40

姓名3:4分50

我现在正在使用WordPress,所以我的查询是

$args = array(
'post_type' => 'entry', 
'posts_per_page' => 4, 
'order'     => 'ASC',
'orderby'   => 'meta_value_num',
'meta_key'  => 'in_seconds', 

'meta_query' => array(
    'relation' => 'AND',
    array(
        'key'     => 'act',
        'value'   => $post->ID,
        'compare' => '=',
    ),
    array(
        'key'     => 'in_seconds',
        'value'   => $seconds,
        'type'    => 'numeric',
        'compare' => '>=',
    ),
),
);

这让我得到了最接近的值,但前提是它们更高,而不是更低。 显然我更喜欢使用wp_query有一种方法可以做到这一点,但如果有人知道这样做的方法(即使它是一个沉重的多循环) - 我会永远感激!

作为参考,所有猜测都会在几秒钟内存储在数据库中。

希望你能帮忙! 谢谢, 安迪:)

1 个答案:

答案 0 :(得分:0)

我担心只使用简单的WP_Query就无法达到你想要的效果。虽然您应该能够通过帖子与所需之间的差异的绝对值来定位帖子。您的代码将类似于:

$args = array(
    'posts_per_page' => 4, 
    'order'     => 'ASC',
    'orderby'   => 'meta_value_num',
    'meta_key'  => 'in_seconds', 
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key'     => 'act',
            'value'   => $post->ID,
            'compare' => '=',
        ),
    ),
);

posts_orderby过滤器可更改订单行为:

global $seconds_where;
$seconds_where = $seconds;
function seconds_posts_orderby( $orderby ) {
    $orderby = " ABS($seconds - meta_value) ASC";
    return $orderby;
}
add_filter('posts_orderby', 'seconds_posts_orderby');
$my_query = new WP_Query($args);
remove_filter('posts_orderby', 'seconds_posts_orderby');

这只是一个开始,但我希望这会有所帮助。