比较mysql行中的项目数(php wordpress)

时间:2012-10-27 08:36:45

标签: wordpress

在我的wordpress模型中,我为用户提供了meta_value,称为ref_credit。 sandro的这个元值看起来像这样:

174 1   ref_credit  a:2:{i:0;s:1:"9";i:1;s:2:"10";}

意味着他引用了id = 9,10

的用户

另一个用户meta_value如下所示:

209 9   ref_credit  a:1:{i:0;s:2:"11";}

他只提到1个用户ID = 11。

现在我想创建一个简单的排行榜,我嘲笑了一些东西,但逻辑是完全错误的。我理解我的代码比较值和订单。我想按照推荐的用户数来订购。

有什么想法吗?

完整的功能是:

    //get_users calls WP_User_Query and returns an array of matching users
    $users = get_users(

        array(  'fields' => 'all_with_meta',
                'meta_query' => array( array( 'key' => 'ref_credit', // the meta field (or key) we want to target
                                              'compare' => '>='  // comparison method (optional:  =, >, <, etc)
        )))
    );

            //custom function for comparing the data we want to sort by
            function cmp($a, $b){
              if ($a->points == $b->points) {
                return 0;
              }
              return ($a->points > $b->points) ? -1 : 1;
            }

    //usort sorts our $users array with our function cmp()
    usort($users, 'cmp');

    //leaving an array of $users sorted by the value of meta 'points'
    echo '<ol>';
        foreach ($users as $user) {  
            echo '<li>' . $user->display_name . '</li>';
        }
    echo '</ol>';

1 个答案:

答案 0 :(得分:0)

我认为有一些问题。

首先,all_with_meta似乎没有带回元数据,尽管顾名思义。不确定它应该做什么 - codex没有多大帮助。因此,您必须自己获取ref_credit值。

其次,您的比较似乎是使用名为points的内容,而不是ref_credit。不知道那是从哪里来的。由于ref_credit是一个数组,因此您必须比较数组长度,而不是值本身(使用count说)。

原样保留原始查询,这样的事情应该有效(尽管你可能需要检查我的cmp结果是否正确):

//get_users calls WP_User_Query and returns an array of matching users
$users = get_users(
    array(  'fields' => 'all_with_meta',
            'meta_query' => array(
                array( 'key' => 'ref_credit', // the meta field (or key) we want to target
                    'compare' => '>='  // comparison method (optional:  =, >, <, etc)
                )
            )
        )
);

foreach($users as $user_id => $user) {
    $user->ref_credit = get_user_meta($user_id, 'ref_credit', true);
}

//custom function for comparing the data we want to sort by
function cmp($a, $b){
    return count($b->ref_credit) - count($a->ref_credit);
}

usort($users, 'cmp');

//leaving an array of $users sorted by the value of meta 'points'
echo '<ol>';
    foreach ($users as $user) {
        echo '<li>' . $user->display_name . '</li>';
    }
echo '</ol>';