简体   繁体   English

PHP多维数组排序将一个元素值保持在第一位置

[英]PHP Multidimensional array sort keeping one element value at first position

I have a multidimensional array named $newArray have below values: 我有一个名为$ newArray的多维数组,其值如下:

$newArray = 
   (
    [0] => Array
        (
            [CountryID] => 24
            [val] => 1
            [PostID] => 1
            [id] => 0
        )

    [1] => Array
        (
            [CountryID] => 355
            [val] => 0.1
            [PostID] => 2
            [id] => 1
        )

    [2] => Array
        (
            [CountryID] => 241
            [val] => 0.3
            [PostID] => 3
            [id] => 2
        )

    [3] => Array
        (
            [CountryID] => 135
            [val] => 0.02
            [PostID] => 4
            [id] => 3
        )

    [4] => Array
        (
            [CountryID] => 24
            [val] => 0.003
            [PostID] => 5
            [id] => 4
        )

    [5] => Array
        (
            [CountryID] => 355
            [val] => 5
            [PostID] => 6
            [id] => 5
        )

    [6] => Array
        (
            [CountryID] => 355
            [val] => 4
            [PostID] => 23
            [id] => 6
        )

    [7] => Array
        (
            [CountryID] => 24
            [val] => 2
            [PostID] => 1
            [id] => 7
        )

    [8] => 
)

I want to sort [CountryID] in DESC, [val] in DESC order only after filtering one element value "24" of [CountryID] on top (with [val] DESC of course), so result should be below: 我要排序[CountryID]在DESC, [val]在DESC顺序过滤一种元素值“24”的后只[CountryID]在上面(与[val]当然DESC),所以结果应该是以下:

$newArray = 
    (
        [1] => Array
            (
                [CountryID] => 24
                [val] => 2
                [PostID] => 1
                [id] => 7
            )

        [2] => Array
            (
                [CountryID] => 24
                [val] => 1
                [PostID] => 1
                [id] => 0
            )       

        [3] => Array
            (
                [CountryID] => 24
                [val] => 0.003
                [PostID] => 5
                [id] => 4
            )

        [4] => Array
            (
                [CountryID] => 355
                [val] => 5
                [PostID] => 6
                [id] => 5
            )

        [5] => Array
            (
                [CountryID] => 355
                [val] => 4
                [PostID] => 23
                [id] => 6
            )

        [6] => Array
            (
                [CountryID] => 355
                [val] => 0.1
                [PostID] => 2
                [id] => 1
            )

        [7] => Array
            (
                [CountryID] => 241
                [val] => 0.3
                [PostID] => 3
                [id] => 2
            )

        [8] => Array
            (
                [CountryID] => 135
                [val] => 0.02
                [PostID] => 4
                [id] => 3
            )   

    )

What function I should use here in order to sort a multidimensional array with above order and condition? 为了对具有上述顺序和条件的多维数组排序,我应该在这里使用什么函数?

I am still learning arrays in php and limited knowledge of that. 我仍在学习php数组,对此知识有限。

You can extract value which you need later, and filter the array to avoid warning. 您可以提取以后需要的值,并对数组进行过滤以避免警告。

$inputSearch = 24;
$k = array_keys(array_column($newArray, 'CountryID'), 24);    
foreach($k as $v){
    $temp[] = $newArray[$v];    
    unset($newArray[$v]);
}
array_multisort(array_column($temp, 'val'), SORT_DESC, $temp);
$newArray = array_filter($newArray);
array_multisort(array_column($newArray, 'CountryID'), SORT_DESC,array_column($newArray, 'val'),      SORT_DESC,$newArray);
$newArray = array_merge($temp , $newArray);                
print_r($newArray);

array_column - Return the values from a single column in the input array array_column-从输入数组中的单个列返回值
array_filter - Filters elements of an array using a callback function array_filter-使用回调函数过滤数组的元素
array_search — Searches the array for a given value and returns the first corresponding key if successful array_search —在数组中搜索给定值,如果成功,则返回第一个对应的键
array_multisort — Sort multiple or multi-dimensional arrays array_multisort —对多维或多维数组进行排序
array_unshift — Prepend one or more elements to the beginning of an array array_unshift —在数组的开头添加一个或多个元素
array_keys — Return all the keys or a subset of the keys of an array array_keys —返回数组的所有键或键的子集

Demo . 演示

Output 产量

Array
(
    [0] => Array
        (
            [CountryID] => 24
            [val] => 2
            [PostID] => 1
            [id] => 7
        )

    [1] => Array
        (
            [CountryID] => 24
            [val] => 1
            [PostID] => 1
            [id] => 0
        )

    [2] => Array
        (
            [CountryID] => 24
            [val] => 0.003
            [PostID] => 5
            [id] => 4
        )

    [3] => Array
        (
            [CountryID] => 355
            [val] => 5
            [PostID] => 6
            [id] => 5
        )

    [4] => Array
        (
            [CountryID] => 355
            [val] => 4
            [PostID] => 23
            [id] => 6
        )

    [5] => Array
        (
            [CountryID] => 355
            [val] => 0.1
            [PostID] => 2
            [id] => 1
        )

    [6] => Array
        (
            [CountryID] => 241
            [val] => 0.3
            [PostID] => 3
            [id] => 2
        )

    [7] => Array
        (
            [CountryID] => 135
            [val] => 0.02
            [PostID] => 4
            [id] => 3
        )

)

Using usort you can solve your problem. 使用usort可以解决您的问题。 Example: 例:

usort($newArray, function($a, $b) {
    if ($a['CountryID'] == 135 OR $b['CountryID'] == 135) return 1;
    $retval = $b['CountryID'] - $a['CountryID'];
    if ($retval == 0) {
        $retval = $b['val'] - $a['val'];
    }
    return $retval;
});

echo '<pre>', print_r($newArray);

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

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