3 Stimmen

Sortiere ein 3-Reihen-2D-Array; sortiere die erste Spalte aufsteigend, aber mit leeren Werten zuletzt, und sortiere dann die anderen Spalten.

Ich habe ein paar Arrays wie folgt.

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

Ich versuche nach Postleitzahlen, Staaten und Counties zu sortieren. Das Problem, das ich habe, besteht darin, die Postleitzahlen in aufsteigender Reihenfolge nach der ersten Postleitzahl im String anzuzeigen. Also wäre die Reihenfolge

64055, 64056, ...

89002, 89009, ...

91381, 91384, ...

94530, 94804, ...

Hier sind meine aktuellen Ergebnisse.

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,

Meine Frage ist, wie kann ich die Postleitzahlen aufsteigend sortieren?

Ich verwende derzeit die folgende Funktion zum Sortieren.

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

4voto

Paul Stanley Punkte 3876

Also gehe ich davon aus, dass Sie ein Array mit drei Arrays von Bundesstaaten, Landkreisen und Postleitzahlen haben. Ich gehe auch davon aus, dass Ihr Array, das diese Arrays enthält $data genannt wird, also ersetzen Sie den Namen Ihres Arrays dort.

Ich glaube, Ihr ursprüngliches Array ist so aufgebaut.

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

Also ist das meine Lösung:

//eigenes Array mit Bundesstaat, Landkreis und PLZ erstellen
$sortData=array();
foreach($data['state'] as $key =>$thisState){

//zuerst die PLZ-Zeichenfolge selbst sortieren
$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'].'';

}

Und ich denke, dass dies das ist, wonach Sie suchen:

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

0 Stimmen

Das ist das, was ich brauche, aber ich benötige die Postleitzahlen oben, beginnend mit 64055 und endend mit 98004.

0 Stimmen

Ich habe den Code bearbeitet und seine Ausgabe überprüft, ist es jetzt richtig?

0 Stimmen

Ich habe die Sortierung der Postleitzahlen im String am falschen Ort gemacht. Überprüfe es.

1voto

satrun77 Punkte 3182

Hier ist der Code, der Ihnen helfen könnte

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

Sie können den $key verwenden, um zu entscheiden, welche Sortierfunktion verwendet werden soll

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

0voto

Ed Meacham Punkte 493

Ich habe diese Klasse verwendet: http://www.php.net/manual/en/function.uksort.php#71152

Es ist einfach zu verwenden und leicht anpassbar für individuelle Anforderungen.

0voto

mickmackusa Punkte 36793

Erstellen Sie ein temporäres Array, das die niedrigste Postleitzahl aus jeder Liste von Postleitzahlen enthält; wenn ein leerer String, weisen Sie PHPs maximale Ganzzahl zu. Dies wird später verwendet, um in aufsteigender Richtung zu sortieren.

Das Erstellen dieses temporären Arrays wird sinnvollerweise während des iterativen Sortierens von durch Kommas getrennten Postleitzahlen durchgeführt. Beim Iterieren der Postleitzahlen per Referenz einfach aufteilen, sortieren und dann wieder zusammenführen.

Rufen Sie schließlich array_multisort() mit dem Array der niedrigsten Postleitzahlen zuerst auf; dies wirkt sich auf alle nachfolgenden Array-Elemente aus, die veränderbar sind (alle restlichen Argumente in diesem Fall). Dann sortieren nach Postleitzahlen, dann nach Bundesland, dann nach Landkreisen.

Code: (Demo)

$lowestZips = [];
foreach ($array['zipcodes'] as &$zips) {
    $zips = explode(', ', $zips);
    sort($zips);
    $lowestZips[] = $zips[0] ?: PHP_INT_MAX;
    $zips = implode(', ', $zips);
}

array_multisort(
    $lowestZips,
    $array['zipcodes'],
    $array['state'],
    $array['counties']
);
var_export($array);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X