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.
精彩评论