php多维排序

标签 php multidimensional-array sorting

我有几个这样的数组。

Array
(
[state] => Array
    (
        [0] => WA
        [1] => CA
        [2] => CA
        [3] => NV
        [4] => MO
        [5] => CA
        [6] => CA
        [7] => CA
        [8] => CT
        [9] => FL
        [10] => FL
        [11] => ID
        [12] => ID
        [13] => IN
        [14] => MN
        [15] => MN
        [16] => NE
        [17] => NY
        [18] => TX
        [19] => TX
        [20] => WI
    )



[counties] => Array
    (
        [0] => King, Snohomish
        [1] => Contra Costa
        [2] => Los Angeles
        [3] => Clark
        [4] => Jackson
        [5] => Tulare
        [6] => Sacramento
        [7] => Riverside
        [8] => New Haven
        [9] => Pinellas
        [10] => Lake
        [11] => Canyon
        [12] => Ada
        [13] => Tippecanoe, White, Carroll
        [14] => Crow Wing, Cass
        [15] => Blue Earth
        [16] => Douglas
        [17] => Rockland
        [18] => Webb
        [19] => Harris
        [20] => Waukesha, Milwaukee, Washington


    )

[zipcodes] => Array
    (
        [0] => 98004, 98005, 98006, 98007, 98008, 98011, 98012, 98102, 98105, 98112, 98136, 98025, 98033, 98034, 98083

        [1] => 94530, 94804, 94805, 94803, 94806, 94564, 94547

        [2] => 91381, 91384, 91354, 91355, 91321, 91387, 91351, 91390, 91350
        [3] => 89002, 89009, 89011, 89012, 89014, 89015, 89016, 89128, 89048, 89052, 89053, 89060, 89061, 89074, 94588, 89102, 89105, 89108, 89109, 89111, 89112
        [4] => 64055, 64056, 64057, 64052, 64064, 64050, 64058, 64014, 64015, 64029, 64063, 64081, 64082, 64086, 64133

        [5] => 
        [6] => 
        [7] => 
        [8] => 
        [9] => 
        [10] => 
        [11] => 
        [12] => 
        [13] => 
        [14] => 
        [15] => 
        [16] => 
        [17] => 
        [18] => 
        [19] => 
        [20] => 
    )
)

我正在尝试按邮政编码排序,然后按州排序,然后按县排序。我遇到的问题是让邮政编码按字符串中第一个邮政编码的升序显示。所以顺序是

64055, 64056, ...

89002, 89009, ...

91381, 91384, ...

94530, 94804, ...

这是我目前的结果。

WA,TL-WA-150,150,King, Snohomish,98004, 98005, 98006, 98007, 98008, 98011, 98012, 98102, 98105, 98112, 98136, 98025, 98033, 98034, 98083

CA,HD-CA-125,125,Contra Costa,94530, 94804, 94805, 94803, 94806, 94564, 94547

CA,DH-CA-125,150,Los Angeles,91381, 91384, 91354, 91355, 91321, 91387, 91351, 91390, 91350

NV,CM1-NV-150,150,Clark,89002, 89009, 89011, 89012, 89014, 89015, 89016, 89128, 89048, 89052, 89053, 89060, 89061, 89074, 94588, 89102, 89105, 89108, 89109, 89111, 89112

MO,CJ-MO-150,150,Jackson,64055, 64056, 64057, 64052, 64064, 64050, 64058, 64014, 64015, 64029, 64063, 64081, 64082, 64086, 64133

CA,GR6-CA-150,150,Tulare,

CA,SSJ-CA-150,150,Sacramento,

CA,LM1-CA-150,150,Riverside,

CT,TAMRM-CT-150,150,New Haven,

FL,GG-FL-150,150,Pinellas,

我的问题是如何让邮政编码按升序排序?

我现在正在使用它进行排序。

sortDataSet($difarray, 'zipcodes', SORT_DESC, SORT_NUMERIC, 'state', SORT_ASC, SORT_STRING,'counties', SORT_DESC, SORT_STRING); 

function sortDataSet(&$dataSet) {
$args = func_get_args();
$callString = 'array_multisort(';
$usedColumns = array();
for($i = 1, $count = count($args); $i < $count; ++$i) {
    switch(gettype($args[$i])) {
        case 'string':
            $callString .= '$dataSet[\''.$args[$i].'\'], ';
            array_push($usedColumns, $args[$i]);
            break;
        case 'integer':
            $callString .= $args[$i].', ';
            break;
        default:
            throw new Exception('expected string or integer, given '.gettype($args[$i]));
    }
}
foreach($dataSet as $column => $array) {
    if(in_array($column, $usedColumns)) continue;
    $callString .= '$dataSet[\''.$column.'\'], ';
}
eval(substr($callString, 0, -2).');');
}

最佳答案

所以我假设您有一个包含三个数组的数组,即州、县和邮政编码。 我还假设您的包含这些数组的数组称为 $data,因此请在此处替换您的数组名称。

我相信您的原始数组是这样设置的。

$data = array(
'state' => array
    (
     'WA',
     'CA',
     'CA',
     'NV',
     'MO',
     'CA',
     'CA',
     'CA',
     'CT',
     'FL',
     'FL',
     'ID',
     'ID',
     'IN',
     'MN',
     'MN',
     'NE',
     'NY',
     'TX',
     'TX',
     'WI'
),

'counties' => array
(
     'King, Snohomish',
     'Contra Costa',
     'Los Angeles',
     'Clark',
     'Jackson',
     'Tulare',
     'Sacramento',
     'Riverside',
     'New Haven',
     'Pinellas',
     'Lake',
     'Canyon',
     'Ada',
     'Tippecanoe, White, Carroll',
     'Crow Wing, Cass',
     'Blue Earth',
     'Douglas',
     'Rockland',
     'Webb',
     'Harris',
     'Waukesha, Milwaukee, Washington'


),

'zipcodes' => array
(
    '98004, 98005, 98006, 98007, 98008, 98011, 98012, 98102, 98105, 98112, 98136, 98025, 98033, 98034, 98083',
    '94530, 94804, 94805, 94803, 94806, 94564, 94547',
    '91381, 91384, 91354, 91355, 91321, 91387, 91351, 91390, 91350',
    '89002, 89009, 89011, 89012, 89014, 89015, 89016, 89128, 89048, 89052, 89053, 89060, 89061, 89074, 94588, 89102, 89105, 89108, 89109, 89111, 89112',
    '64055, 64056, 64057, 64052, 64064, 64050, 64058, 64014, 64015, 64029, 64063, 64081, 64082, 64086, 64133',
    '','','','','','','','','','','','','','','',''
));

所以,这是我的解决方案:

//make our own array with state, counties, and zips living together.
$sortData=array();
foreach($data['state'] as $key =>$thisState){

//first sort the zipcode string itself.
$zipcodeArray = explode(", ",$data['zipcodes'][$key]);
sort($zipcodeArray,SORT_NUMERIC);
$zipcodeString = implode(", ",$zipcodeArray);

$pusharray=array('state'=>$thisState,'county'=>$data['counties'][$key],'zipcode'=>$zipcodeString);
array_push($sortData,$pusharray);

}//foreach

$states=array();
$counties=array();
$zipcodes=array();
foreach ($sortData as $key => $row) {

    $states[$key] = $row['state'];
    $counties[$key] = $row['county'];
    $zipcodes[$key] = $row['zipcode'];

}//
$index=0;

array_multisort($zipcodes, SORT_NUMERIC, SORT_ASC, $states, SORT_ASC, $counties,  SORT_ASC, $sortData);


function blank($var)
{
 if (empty($var['zipcode'])){return true;}else{return false;}
}

function zipcodeString($var)
{
 if (!(empty($var['zipcode']))){return true;}else{return false;}
}


$noZipcodeChunk=(array_filter($sortData, "blank"));
$zipcodeChunk=(array_filter($sortData, "zipcodeString"));
$finalArray = array_merge($zipcodeChunk,$noZipcodeChunk);



foreach ($finalArray as $datum){
    echo $datum['state'].' '.$datum['county'].' '.$datum['zipcode'].'<br>';

}

我认为这就是您要寻找的:

MO Jackson 64014, 64015, 64029, 64050, 64052, 64055, 64056, 64057, 64058, 64063, 64064, 64081, 64082, 64086, 64133
NV Clark 89002, 89009, 89011, 89012, 89014, 89015, 89016, 89048, 89052, 89053, 89060, 89061, 89074, 89102, 89105, 89108, 89109, 89111, 89112, 89128, 94588
CA Los Angeles 91321, 91350, 91351, 91354, 91355, 91381, 91384, 91387, 91390
CA Contra Costa 94530, 94547, 94564, 94803, 94804, 94805, 94806
WA King, Snohomish 98004, 98005, 98006, 98007, 98008, 98011, 98012, 98025, 98033, 98034, 98083, 98102, 98105, 98112, 98136
CA Riverside
CA Sacramento
CA Tulare
CT New Haven
FL Lake
FL Pinellas
ID Ada
ID Canyon
IN Tippecanoe, White, Carroll
MN Blue Earth
MN Crow Wing, Cass
NE Douglas
NY Rockland
TX Harris
TX Webb
WI Waukesha, Milwaukee, Washington

关于php多维排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7615367/

相关文章:

java - 快速排序不起作用

c++ - 根据重复次数对输入文本中的单词进行排序?

javascript - 在页面加载时激活在线幻灯片放映

exec - 我可以使用 PHP 代码修改 disable_functions,或者以不涉及修改 php.ini 的方式进行修改吗?

PHP open_basedir 错误

php - 修剪空白

java - 在 Java 中按星期几从星期一到星期日排序

php - 多维数组差异php

ruby - 在 Redis 中为 Ruby 重新创建 zdiffstore

c++ - 使用两个不同大小的一维数组制作二维数组