对多维数组进行排序,大写字母先于小写字母

问题描述 投票:0回答:3

使用以下内容按屏幕名称对多维数组进行排序:

$sortArray = array();

foreach($members as $member){
    foreach($member as $key=>$value){
        if(!isset($sortArray[$key])){
            $sortArray[$key] = array();
        }
        $sortArray[$key][] = $value;
    }
}

$orderby = "screen_name";

array_multisort($sortArray[$orderby],SORT_ASC,$members);

但是大写字母排在小写字母之前:

艾伦 布伦达 格雷格工作

但是Frank先于dan

关于数组排序有很多,但我终于使用上面的方法完成了这个工作,想看看是否有一个简单的方法来修复它?

php
3个回答
1
投票

uasort() 应该适合你

<?php

// custom sort function
function sort_by_screen_name($a, $b) {

    // compare using lowercase strings only
    $a = strtolower($a['screen_name']);
    $b = strtolower($b['screen_name']);

    if ($a == $b) {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

$members = array(
    array('screen_name'=>'Greg'),
    array('screen_name'=>'Allen'),
    array('screen_name'=>'dan'),
    array('screen_name'=>'Brenda'),
);

// uasort() like a boss!
uasort($members, 'sort_by_screen_name');

print_r($members);

输出

Array
(
    [1] => Array
        (
            [screen_name] => Allen
        )

    [3] => Array
        (
            [screen_name] => Brenda
        )

    [2] => Array
        (
            [screen_name] => dan
        )

    [0] => Array
        (
            [screen_name] => Greg
        )

)

注意:使用此方法保留原始数组键。如果您想重写密钥,只需使用

usort()
即可。


1
投票

您可以使用

usort()
和自定义排序功能对其进行排序。如果您想查看它如何适合您自己的自定义详细信息,您可以修改此数据:http://codepad.org/b89HwmbM

$members = array(
  array( "loc" => "Ontario",   "first" => "Bob",  "screen_name" => "fooArt" ),
  array( "loc" => "Atlanta",   "first" => "Sal",  "screen_name" => "TIMMY!" ),
  array( "loc" => "Panama",    "first" => "Mick", "screen_name" => "Analog" ),
  array( "loc" => "Pensacola", "first" => "A",    "screen_name" => "Franky" ),
  array( "loc" => "McPherson", "first" => "Anna", "screen_name" => "annie9" )
);

usort( $members, 'custom_sort' );

function custom_sort( $m1, $m2 ){
  return strtolower( $m1['screen_name'] ) > strtolower( $m2['screen_name'] );
};

此排序方法的输出如下:

Array
(
    [0] => Array
        (
            [loc] => Panama
            [first] => Mick
            [screen_name] => Analog
        )

    [1] => Array
        (
            [loc] => McPherson
            [first] => Anna
            [screen_name] => annie_23
        )

    [2] => Array
        (
            [loc] => Ontario
            [first] => Bob
            [screen_name] => fooArt
        )

    [3] => Array
        (
            [loc] => Pensacola
            [first] => A
            [screen_name] => Franky
        )

    [4] => Array
        (
            [loc] => Atlanta
            [first] => Sal
            [screen_name] => TIMMY!
        )

)

0
投票

在比较字符串之前没有必要改变它们。只需将列值与

strcasecmp()
进行比较(不区分大小写)。 (演示)

$members = [
    ['screen_name'=>'Greg'],
    ['screen_name'=>'Allen'],
    ['screen_name'=>'dan'],
    ['screen_name'=>'Brenda'],
];

uasort($members, fn($a, $b) => strcasecmp($a['screen_name'], $b['screen_name']));

var_export($members);
© www.soinside.com 2019 - 2024. All rights reserved.