【问题标题】:PHP Multidimensional array sort keeping one element value at first positionPHP多维数组排序将一个元素值保留在第一个位置
【发布时间】:2019-02-22 06:35:42
【问题描述】:

我有一个名为 $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] => 
)

我想在 DESC 中对[CountryID] 进行排序,仅在顶部过滤[CountryID] 的一个元素值“24”(当然是[val] DESC)后,以 DESC 顺序对[val] 进行排序,所以结果应该如下:

$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
            )   

    )

我应该在这里使用什么函数来对具有上述顺序和条件的多维数组进行排序?

我仍在学习 php 中的数组,对此知识有限。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    您可以提取稍后需要的值,并过滤数组以避免警告。

    $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 - 从输入数组中的单个列返回值
    array_filter - 使用回调函数过滤数组元素
    array_search - 在数组中搜索给定值并返回成功时的第一个对应键
    array_multisort — 对多个或多维数组进行排序
    array_unshift — 在数组开头添加一个或多个元素
    array_keys — 返回所有键或数组键的子集

    Demo.

    输出

    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
            )
    
    )
    

    【讨论】:

    • 它在元素值唯一的情况下有效,我们可以选择所有在顶部的。 .对于上面的 ex,如果我将 135 替换为 24,那么它应该相应地排序。
    • 它会工作,如果任何 CountryID 只有一个,你想要多个 countryID 吗?
    • 请。它应该匹配顶部的值,然后按照 ['val'] 对其进行排序。之后休息应该按照 ['CountryID'] DESC 和 ['val'] DESC
    • 根据要求更新了我的答案,您没有提到按照val 的最高值排序顺序。所以默认情况下array_multisort(array_column($temp, 'val'), SORT_ASC, $temp); 在这里我保留了 desc。请查看演示以了解您的结果输出。
    • 我并不是要搜索多个值,而是要在多个实例中搜索一个值。例如 CountryID = 24,值应为 -justpaste.it/3eo2f
    【解决方案2】:

    使用usort 可以解决您的问题。示例:

    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);
    

    【讨论】:

    • 它对 DESC 中的所有数组进行排序,而不将“135”保持在顶部。另外,请看我上面的评论!
    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多