2017-09-22 1 views
0

Ich habe ein Array wie folgt aus:PHP Sortier Array mit Subarrays

Array(
    [0]=Array 
    (
    [firstname] => john 
    [lastname] => doe 
    [age] => 35 
    [salary] => Array 
     (
     [gbp] => "180" 
     [eur] => "" 
     [usd] => "" 
    ) 
) 
    [0]=Array 
    (
    [firstname] => john 
    [lastname] => doe 
    [age] => 35 
    [salary] => Array 
     (
     [gbp] => "" 
     [eur] => "180" 
     [usd] => "" 
    ) 
) 
    [0]=Array 
    (
    [firstname] => john 
    [lastname] => doe 
    [age] => 35 
    [salary] => Array 
     (
     [gbp] => "" 
     [eur] => "" 
     [usd] => "224" 
    ) 
) 
) 

Wie I Subarrays durch Werte der verschachtelten Subarray (durch Gehalt) Beginn der höchste Gehalt an der niedrigste Gehalt, unabhängig von der Art, können Währung in Verwendung?

+1

Hier finden Sie die Währungswerte standardisieren müssen, die wahrscheinlich von einer Währung Kommissionierung und sie alle übersetzen zu ihm. Verwenden Sie dann etwas wie http://php.net/manual/en/function.array-multisort.php, um das Array nach dem gewünschten Subindex zu sortieren. – Kwahn

+0

Mit "unabhängig von der verwendeten Währung" meinen Sie, dass 300 Yen mehr als 299 $ wären? –

+0

@EnricoAgrusti Ich meine, dass ich die Währungen berücksichtigen muss, um die Werte von GBP in EUR und USD in USD umzurechnen, um zu sehen, welche größer ist – Ahmed

Antwort

0

hier eine Klasse ist Ihnen zu helfen, gibt es eine customValue() Funktion Ihre Daten zu extrahieren und sie in eine gemeinsame Währung zu konvertieren (I verwendet 'usd), offensichtlich ändert diese Umwandlung täglich

<?php 
class ArrayCustomSort 
{ 
    private $arrCustomValues = []; 
    private $arrFieldOrder = []; 

    public function setCustomValues(array $arrCustomValues) 
    { 
     $this->arrCustomValues = $arrCustomValues; 
     return $this; 
    } 

    public function setFieldOrder(array $arrFieldOrder) 
    { 
     $this->arrFieldOrder = $arrFieldOrder; 
     return $this; 
    } 

    private function customValue($field, $data) 
    { 
     $value = $data; 
     if (is_object($data)) { 
      $value = $data->$field; 
     } elseif (is_array($data)) { 
      $value = $data[$field]; 
     } 

     $result = $value; 
     if (array_key_exists($field, $this->arrCustomValues)) { 
      $mxdOrder = $this->arrCustomValues[$field]; 
      if (is_array($mxdOrder) && ($result = array_search($value, $mxdOrder)) === false) { 
       $result = count($mxdOrder); 
      } elseif (is_string($mxdOrder) && function_exists($mxdOrder)) { 
       $result = $mxdOrder($value); 
      } 
     } 
     return $result; 
    } 

    private function cmp($a, $b) 
    { 
     $result = 0; 
     reset($this->arrFieldOrder); 
     while ($result === 0 && list($key, $value) = each($this->arrFieldOrder)) { 
      if (is_int($key)) { 
       $field = $value; 
       $order = SORT_ASC; 
      } else { 
       $field = $key; 
       $order = $value; 
      } 
      $order = (in_array($order, [SORT_ASC, SORT_DESC])) ? $order : SORT_ASC; 

      $aValue = $this->customValue($field, $a); 
      $bValue = $this->customValue($field, $b); 
      if ($aValue > $bValue) { 
       $result = 1; 
      } elseif ($aValue < $bValue) { 
       $result = -1; 
      } 
      if ($order === SORT_DESC) { 
       $result *= -1; 
      } 
     } 
     return $result; 
    } 

    public function arraySort(array &$arrData) { 
     usort($arrData, ['self', 'cmp']); 
     return $this; 
    } 
} 

$arr = [ 
    [ 
    'firstname' => 'john', 
    'lastname' => 'doe', 
    'age' => 35, 
    'salary' => [ 
     'gbp' => "180", 
     'eur' => "", 
     'usd' => "" 
    ] 
    ], 
    [ 
    'firstname' => 'john', 
    'lastname' => 'doe', 
    'age' => 35, 
    'salary' => [ 
     'gbp' => "", 
     'eur' => "180", 
     'usd' => "" 
    ] 
    ], 
    [ 
    'firstname' => 'john', 
    'lastname' => 'doe', 
    'age' => 35, 
    'salary' => [ 
     'gbp' => "", 
     'eur' => "", 
     'usd' => "224" 
    ] 
    ] 
]; 

function customValue($value) 
{ 
    static $arrToUSD = ['gbp' => 1.35, 'eur' => 1.19 , 'usd' => 1.00]; 
    $result = max([ 
     (!empty($value['gbp'])) ? $value['gbp'] * $arrToUSD['gbp'] : 0, 
     (!empty($value['eur'])) ? $value['eur'] * $arrToUSD['eur'] : 0, 
     (!empty($value['usd'])) ? $value['usd'] * $arrToUSD['usd'] : 0 
    ]); 
    return $result; 
} 

$objArrayCustomSort = new ArrayCustomSort(); 

$objArrayCustomSort->setCustomValues([ 
    'salary' => 'customValue' 
]); 

$objArrayCustomSort->setFieldOrder([ 
    'salary' => SORT_DESC 
]); 

$objArrayCustomSort->arraySort($arr); 

var_dump($arr); 
+0

Ich habe versucht, den Code auszuführen, und ich bekam einen nicht numerischen Wert in Zeile gefunden (111 - 112 - 113) – Ahmed

+0

@Ahmed hoffentlich sollte das, ein Problem in der 'customValue()' -Funktion sortieren. oh, und wenn Sie Einfluss darauf haben, wie der Code strukturiert ist, könnte es eine Idee sein, das "Gehalt" -Array in etwa so zu ändern: '['Gehalt' => ['Betrag' => 180, 'Währung' = > 'gbp]] '- auf diese Weise haben Sie keine Datenredundanz und Sie müssen keine großen Aktualisierungen vornehmen, wenn Sie neue Währungen hinzufügen –

0

Zuerst müssen Sie obwohl die Arrays in einer Schleife und einen Wert zuzuweisen, basierend auf den Währungen

$sortOrder = []; 
foreach ($array as $person) { 
    $sortOrder []= getCurrencyValue($person['salary']); 
} 

getCurrencyValue wo in der Anordnung von Währungen nimmt und gibt eine int als Sortierordnung.

Die Verwendung http://php.net/manual/en/function.array-multisort.php

array_multisort($originalArray, $sortOrder) 

dies die ursprüngliche Array in der gleichen Reihenfolge wie $ sortOrder sortieren, wenn das sortiert wird.

Lesen Sie die Dokumentation für weitere Informationen (achten Sie auf das Volumen und die Ausgabe Beispiel, dass in der Nähe zu dem, was Sie tun)

Verwandte Themen