对 3 行二维数组进行多重排序;对第一列升序排序,但最后为空值,然后对其他列进行排序

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

我有几个像这样的数组。

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).');');
}
php arrays sorting multidimensional-array array-multisort
2个回答
4
投票

所以我假设您有一个包含三个数组的数组,即州、县和邮政编码。 我还假设包含这些数组的数组称为

$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

-1
投票

这是可能对您有帮助的代码

$array = array(
    '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',
    ),
    'state' => array(
        'WA', 'CA', 'FL'
    ),
    'counties' => array(
        'Lake', 'King, Snohomish'
    )
);

foreach ($array as $key => $value) {
    sort($array[$key]); // sort array from lowest to highest http://nz.php.net/manual/en/function.sort.php
    // or reverse sort using arsort http://nz.php.net/manual/en/function.arsort.php
} 

您可以使用 $key 来决定使用哪个排序函数

foreach ($array as $key => $value) {
    if ($key == 'zipcodes') {
        sort($array[$key]);
    } else {
        arsort($array[$key]);
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.