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);
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
Mit "unabhängig von der verwendeten Währung" meinen Sie, dass 300 Yen mehr als 299 $ wären? –
@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