繁体   English   中英

PHP多维数组基于多个条件排序

[英]PHP multidimensional array sort based on multiple criteria

让我们假设我有一个如下所示的数组

    $item = Array(

             [0] => Array(
                     "name" => "item1"
                     "score" => 100,
                     "category" => "A1",
                     "vote"  => 80,
               )

          [1] => Array(
                 "name" => "item2",
                 "score" => 100,
                 "category" => "A1",
                 "vote"    => 70,
           )
           [2] => Array(
                 "name" => "item3",
                 "score" => 80,
                 "category" => "A2",
                 "vote"    => 80,
           )
           [3] => Array(
                 "name" => "item4",
                 "score" => 80,
                 "category" => "A2",
                 "vote"    => 60,
           )
           [4] => Array(
                 "name" => "item5",
                 "score" => 80,
                 "category" => "A3",
                 "vote"    => 80,
           )
    )

编辑输入:

    Array
(
    [0] => Array
        (
            [name] => item1
            [score] => 100
            [category] => A1
            [vote] => 80
        )

    [1] => Array
        (
            [name] => item2
            [score] => 100
            [category] => A1
            [vote] => 80
        )

    [2] => Array
        (
            [name] => item5
            [score] => 80
            [category] => A3
            [vote] => 80
        )

    [3] => Array
        (
            [name] => item3
            [score] => 80
            [category] => A2
            [vote] => 80
        )

    [4] => Array
        (
            [name] => item4
            [score] => 80
            [category] => A2
            [vote] => 60
        )

)

排序的优先级是scorecategoryvote 预期结果是:

$item = Array(

             [0] => Array(
                     "name" => "item1"
                     "score" => 100,
                     "category" => "A1",
                     "vote"    => 80,
               )
            [1] => Array(
                 "name" => "item5",
                 "score" => 80,
                 "category" => "A3",
                 "vote"    => 80,
            )
            [2] => Array(
                 "name" => "item3",
                 "score" => 80,
                 "category" => "A2",
                 "vote"    => 80,
           )

          [3] => Array(
                 "name" => "item2",
                 "score" => 100,
                 "category" => "A1",
                 "vote"    => 70,
           )

           [4] => Array(
                 "name" => "item4",
                 "score" => 80,
                 "category" => "A2",
                 "vote"    => 60,
           )

    )

编辑的预期结果:

   Array
    (
    [0] => Array
        (
            [name] => item1
            [score] => 100
            [category] => A1
            [vote] => 80
        )

    [1] => Array
        (
            [name] => item5
            [score] => 80
            [category] => A3
            [vote] => 80
        )

    [2] => Array
        (
            [name] => item3
            [score] => 80
            [category] => A2
            [vote] => 80
        )
   [3] => Array
        (
            [name] => item2
            [score] => 100
            [category] => A1
            [vote] => 80
        )

    [4] => Array
        (
            [name] => item4
            [score] => 80
            [category] => A2
            [vote] => 60
        )

)

我希望根据score对顶部的不同类别进行排序,然后vote但如果它们是具有相同类别的两个项目,则分数较低的项目将具有较低的优先级。

基于来自 的见解,我首先根据分数、类别和投票对数组进行排序

foreach($list as $k=>$v) {
        $sorted['score'][$k] = $v['score'];
        $sorted['category'][$k] = $v['category'];
        $sorted['vote'][$k] = $v['vote'];
    }

    array_multisort($sorted['score'], SORT_DESC, $sorted['category'], SORT_DESC,$sorted['vote'], SORT_DESC, $list);

它会给我:

    Array
(
    [0] => Array
        (
            [name] => item1
            [score] => 100
            [category] => A1
            [vote] => 80
        )

    [1] => Array
        (
            [name] => item2
            [score] => 100
            [category] => A1
            [vote] => 80
        )

    [2] => Array
        (
            [name] => item5
            [score] => 80
            [category] => A3
            [vote] => 80
        )



  [3] => Array
        (
            [name] => item3
            [score] => 80
            [category] => A2
            [vote] => 80
        )
    [4] => Array
        (
            [name] => item4
            [score] => 80
            [category] => A2
            [vote] => 60
        )

)

我需要再次对结果进行重新排序以在顶部显示不同的类别(请参阅编辑后的预期结果)

编辑:似乎我的示例和问题令人困惑。 这个想法是我想根据分数对项目进行排序,然后投票,但应考虑类别。 除了得分和投票之外,我希望有时间将不同的类别放在首位,然后得分和投票随之而来。

使用 array_multisort()

<?php
$mylist = Array(

             0 => Array(
                     "name" => "item1",
                     "score" => 100,
                     "category" => "A1",
                     "vote"  => 80
               ),

          1 => Array(
                 "name" => "item2",
                 "score" => 100,
                 "category" => "A1",
                 "vote"    => 70
           ),
           2 => Array(
                 "name" => "item3",
                 "score" => 80,
                 "category" => "A2",
                 "vote"    => 80
           ),
           3 => Array(
                 "name" => "item4",
                 "score" => 80,
                 "category" => "A2",
                 "vote"    => 60
           ),
           4 => Array(
                 "name" => "item5",
                 "score" => 80,
                 "category" => "A3",
                 "vote"    => 80
           )
    );

$sort = array();
foreach($mylist as $k=>$v) {
    $sort['score'][$k] = $v['score'];
    $sort['category'][$k] = $v['category'];
    $sort['vote'][$k] = $v['vote'];
}
# sort by event_type desc and then title asc
array_multisort($sort['vote'], SORT_DESC,$sort['score'], SORT_DESC, $sort['category'], SORT_DESC,$mylist);
    echo '<pre>';
    print_r($mylist);
    echo '</pre>';
?>

注意:这不是答案,这只是建议。 假设是一条评论,但有代码而且很长。

首先,我只是将您的输入数组修改为这个模型:

在此处输入图片说明

使用此代码:

$compiled = array();

for ($i = 0; $i < count($input_arr); $i++)
{
    $cat = $input_arr[$i]['category'];

    $index = count($compiled[$cat]);

    $compiled[$cat][$index]['name'] = $input_arr[$i]['name'];
    $compiled[$cat][$index]['score'] = $input_arr[$i]['score'];
    $compiled[$cat][$index]['vote'] = $input_arr[$i]['vote'];
    $compiled[$cat][$index]['overall'] = $input_arr[$i]['score'] + $input_arr[$i]['vote'];
}

我只是按category排列。 也是我加入overall它的评分和投票的简单相加。 :)

所有的排序都在这里:

foreach ($compiled as $k => $v)
{
    $json['sorted_by_vote'][$k] = sort_sub_value($compiled[$k], 'vote', false);

    $json['sorted_by_score'][$k] = sort_sub_value($compiled[$k], 'score', false);

    for ($i = 0;$i < count($compiled[$k]); $i++)
    {
        $json['sorted_by_overall'][] = $compiled[$k][$i];
    }
}
$json['sorted_by_overall'] = sort_sub_value($json['sorted_by_overall'], 'overall', false);

$json['input'] = $input_arr;

$json['revamp'] = $compiled;

echo json_encode($json);

function sort_sub_value($array, $subkey, $is_asc = true)
{
    foreach($array as $k=>$v) 
    {
        $b[$k] = strtolower($v[$subkey]);
    }

    if ($is_asc)
        asort($b); // asort -> asc | arsort ->desc
    else
        arsort($b);

    foreach($b as $key=>$val) 
    {
        $c[] = $array[$key];
    }
    return $c;
}

并将产生这个:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

最后这里是示例输入,我只是搞砸了要测试的votes

在此处输入图片说明

希望这会因其他原因而有所帮助。 兄弟加油! :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM