查找数组中最接近的值


Finding the closest values in an array

希望有人能帮忙,我目前正在为比赛做一个构建 - 目标是让用户猜测逃脱者执行行为所需的时间,所以你会有以下场景:

第一幕 - 逃脱者在2分30秒内完成

假设您有 5 个猜测:

名称 1: 1分钟 20

名称 2: 2分钟 20

名称 3: 5分钟 50

名称 4: 6分钟 10

名称 5: 3分钟 40

当逃脱者完成后,他们希望能够显示前 4 个结果,所以在这种情况下,它将是:

名称 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来做到这一点,但如果有人知道一种方法(即使它是一个繁重的多重循环) - 我将永远感激不尽!

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

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

怕仅使用简单的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');

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