开发者

php multidimensional sort

开发者 https://www.devze.com 2023-04-10 00:24 出处:网络
I have an a couple of arrays like so. Array ( [state] => Array ( [0] => WA [1] => CA [2] => CA [3] => NV

I have an a couple of arrays like so.

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

I am trying to sort by zipcodes then by state then by counties. The problem I am having is getting the zipcodes to display in ascending order by the first zip in the string. So the order would be

64055, 64056, ...

89002, 89009, ...

91381, 91384, ...

94530, 94804, ...

Here are my current results.

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, 8901开发者_StackOverflow社区1, 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,

My question is how can I get the zipcodes to sort ascending?

I am using this for sorting right now.

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).');');
}


So I am assuming that you have an array with three arrays, of states, counties, and zipcodes. I also assume that your array containing these arrays is called $data, so substitute the name of your array there.

I believe your original array is setup like this.

$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',
    '','','','','','','','','','','','','','','',''
));

So, this is my solution:

//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>';

}

And I think this is what you area looking for:

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


Here is code that might help you

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

You can use the $key to decide which sort function to use

foreach ($array as $key => $value) {
    if ($key == 'zipcodes') {
        sort($array[$key]);
    } else {
        arsort($array[$key]);
    }
} 


I have used this class: http://www.php.net/manual/en/function.uksort.php#71152

It's easy to use and easily extended for customization.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号