我有一对这样的数组。
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] =>
)
)
我正在尝试按邮政编码排序,然后按州排序,然后按县排序。我遇到的问题是让邮政编码按升序显示字符串中的第一个zip。所以顺序是
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
下面的代码可能会对您有所帮助
$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]);
}
}
我已经使用了这个类:http://www.php.net/manual/en/function.uksort.php#71152