Ich habe ein Array wie dieses:

$row_arr_1=array(7,9,5,10);

Jetzt möchte ich das Ergebnisarray wie folgt erhalten:

$row_arr_2=array(3,2,4,1);

Erläuterung:

Da 10 der größte Wert in row_arr_1 ist, wird er durch den Wert 1 ersetzt.

Da 9 der zweithöchste Wert von row_arr_1 ist, wird er durch 2 usw. ersetzt.

Ich habe versucht, die Werte von row_arr_1 zu sortieren, aber die Position wurde geändert.

Wie kann ich mein gewünschtes Ergebnis erzielen?

-1
Md. Shamvil Hossain 18 Apr. 2018 im 09:07

4 Antworten

Beste Antwort

Dies kann mit rsort () und array_search ()

$row_arr_1=array(7,9,5,10);
$row_copy = $row_arr_1;
$row_arr_2 = array();
rsort($row_copy);
foreach($row_arr_1 as $val) {
    $row_arr_2[] = array_search($val, $row_copy) + 1;
}
print_r($row_arr_2);

https://eval.in/990078

3
Anant Singh---Alive to Die 18 Apr. 2018 im 06:42

Sie können arsort() verwenden, um das Array unter Beibehaltung der Schlüssel zu sortieren. und verwenden Sie diese Schlüssel für Ihr Array über array_keys():

$row_arr_1 = array(7,9,5,10);
$row_arr_1_backup = $row_arr_1;


arsort($row_arr_1_backup);
$row_arr_2 = array_keys($row_arr_1_backup);

asort($row_arr_2);
$row_arr_2 = array_keys($row_arr_2);


array_walk($row_arr_2, function(&$item, &$key) {
    $item = $item + 1;
});

Sie müssen das ursprüngliche Array duplizieren, da arsort das tatsächliche Array sortiert, auf das es zeigt, anstatt ein neues Array zurückzugeben.

1
Anthony 18 Apr. 2018 im 06:44
$row_arr_1_old = array(7, 9, 5, 10);
$row_arr_1 = array(7, 9, 5, 10);
rsort($row_arr_1);

$test = [];
foreach ($row_arr_1_old as $key => $value) {
    $test[] = array_search($value, $row_arr_1);
}

print_r($test);
0
Sachin Aghera 18 Apr. 2018 im 07:15

Versuchen Sie für eine optimale Effizienz, die Gesamtzahl der Funktionsaufrufe zu reduzieren. Dies bedeutet insbesondere, dass iterierte Funktionsaufrufe minimiert / eliminiert werden.

Dies ist meine etwas effizientere Version von Ahsans Antwort.

Code: (Demo)

$copy = $arr = [7, 9, 5, 10];
rsort($arr);                      // generates: [10, 9, 7, 5]
$flipped = array_flip($arr);      // generates: [10 => 0, 9 => 1, 7 => 2, 5 => 3]
foreach($copy as $v) {
    $result[] = ++$flipped[$v];   // adds one to each accessed value from $flipped
}
var_export($result);

Ausgabe:

array (
  0 => 3,
  1 => 2,
  2 => 4,
  3 => 1,
)
0
mickmackusa 20 Apr. 2018 im 13:15