2017-05-14 4 views
0

Ich habe ein Array, und ich will es sortieren:Sortieren Array mehrdimensional von erster Subarrays

$ArrayStock = array(array("SIZE","L","XL","M"),("STOCK","12","3","2")); 

Wie kann ich das Array von „SIZE“ sortieren?

Alternativ könnte ich dieses Array als Ausgangspunkt verwenden:

$ArrayStock = array(array("L","XL","M"),("12","3","2")); 
+0

können Sie nicht, weil für einige Stupi d Grund "Größe" ist Teil Ihres Arrays und kein Schlüssel –

+0

ok, wie sortiere ich, wenn ich "Größe" und "Lager" lösche? so wie dieses $ ArrayStock = Array (Array ("L", "XL", "M"), ("12", "3", "2")); –

+0

es assoziativ machen – Thielicious

Antwort

0

Es gibt ein paar Möglichkeiten, diese Katze zu häuten. Alle meine Methoden wird die erwartete Ausgabe ...

Zuerst lassen Sie uns tun es ohne Umstrukturierung Array (Demo) produzieren:

$order=["XS","S","M","L","XL","2XL","3XL"]; // declare appropriate size order 
$ArrayStock=[["L","XL","M"],["12","3","2"]]; 

// Order the first subarray: 
uasort($ArrayStock[0],function($a,$b)use($order){ 
    return (array_search($a,$order)>array_search($b,$order)?1:-1); // any unidentifed sizes will go to the front 
}); 

// Sync the second subarray with first subarray: 
$ArrayStock[1]=array_replace($ArrayStock[0],$ArrayStock[1]); 

// Optionally re-index the keys: 
$ArrayStock[0]=array_values($ArrayStock[0]); 
$ArrayStock[1]=array_values($ArrayStock[1]); 


Als nächstes habe ich ein paar Möglichkeiten zeigen werden dass Sie ein restrukturiertes Array manipulieren können. Es ist absolut nichts falsch an der Art, wie trincot seine geschrieben hat. Dies sind nur Alternativen, die ich mir ausgedacht habe ...

Ich stimme Trincot über die Verwendung von Größen als Schlüssel (weil sie eindeutig sein werden) und Lager zählt als Werte.So ist der erste Prozess ist, dass neue Array-Struktur zu erzeugen:

$ArrayStock=[["L","XL","M"],["12","3","2"]]; 

# 1 Einzeiler array_combine() Ansatz:

$new_structure=array_combine($ArrayStock[0],$ArrayStock[1]); 
// $new_structure = ['L'=>'12','XL'=>'3','M'=>'2'] 

# 2foreach() Ansatz:

foreach($ArrayStock[0] as $i=>$size){ 
    $new_structure[$size]=$ArrayStock[1][$i]; 
} 
// $new_structure = ['L'=>'12','XL'=>'3','M'=>'2'] 

nun das neue Array zu sortieren, Sie uksort() oder eine Reihe anderer Array-Funktionen/Schleifen mit Ihrem vorgegebenen Reihenfolge Array verwenden können:

$order=["XS","S","M","L","XL","2XL","3XL"]; // declare whatever appropriate sizes in order 

# 1uksort() mit array_search() Ansatz:

uksort($new_structure,function($a,$b)use($order){ 
    return (array_search($a,$order)>array_search($b,$order)?1:-1); 
    // any unidentified sizes will go to the front of the array 
}); 
// keep in mind, this doesn't declare $result, it sorts $new_structure 

# 2array_replace() mit array_flip() - array_intersect() - array_keys() Ansatz:

$result=array_replace(      // replace values on matching keys 
      array_flip(      // swap keys with values 
       array_intersect(
        $order,     // keep values from here 
        array_keys($new_structure) // that exist here 
       ) 
      ), 
     $new_structure);      // use these elements for replace 
// $result=['M'=>'2','L'=>'12','XL'=>'3']; 

# 3foreach() mit array_intersect()-array_keys() Ansatz:

// generate & iterate ordered array 
foreach(array_intersect($order,array_keys($new_structure)) as $v){ 
    $result[$v]=$new_structure[$v];  // build properly sorted array 
} 
// $result=['M'=>'2','L'=>'12','XL'=>'3']; 

schließlich als Trincot gezeigt hat, Sie kann kehrt die sortierten Daten zurück in das Ausgangsformat mit einer weiteren ein- Liner:

$ArrayStock=[array_keys($result),array_values($result)]; 
+0

@HengkyST Sorry für die langatmige Antwort. Sie können einfach die zweistufige Methode verwenden, mit der ich anfange, oder Sie können Ihr Array neu strukturieren und eine der vielen Techniken verwenden, um die Daten zu sortieren. Ich wollte deine Frage hauptsächlich verwenden, um Leser zu erziehen. Lassen Sie mich wissen, wenn etwas für Sie nicht funktioniert oder wenn Sie etwas nicht verstehen, das ich geschrieben habe. – mickmackusa

+0

Ich sehr, sehr voll für kompilieren Tutorial $ ArrayStock @mickmackusa, ich versuche, und es ist Arbeit für mich. –

+0

@HengkyST Das Vergnügen ist meins. Ich lerne immer mehr durch Experimentieren/Lehren. – mickmackusa

1

Man könnte es wie folgt tun:

// Combine into one associative array 
$combined = array_combine($ArrayStock[0], $ArrayStock[1]); 

// Rebuild it in the correct order: 
foreach(["SIZE", "S","M","L","XL","XXL"] as $size) { 
    if (isset($combined[$size])) $result[$size] = $combined[$size]; 
} 

// Split associative array back to its original structure: 
$ArrayStock = [array_keys($result), array_values($result)]; 

Beachten Sie, dass diese Struktur in der Anwendung nicht so praktisch ist. Ich würde tatsächlich mit dem assoziativen Array bleiben.