将数组数组映射到数组

时间:2018-04-18 06:07:18

标签: php arrays sorting

我有一个这样的数组:

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

现在我想得到像这样的结果数组:

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

说明:

由于10row_arr_1中的最大值,因此它将替换为值1.

同样,由于9row_arr_1的第二高值,因此它将被替换为2,依此类推。

我尝试对row_arr_1的值进行排序,但位置已更改。

如何 我可以得到我想要的结果吗?

4 个答案:

答案 0 :(得分:3)

可以使用rsort()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

答案 1 :(得分:1)

您可以使用arsort()对数组进行排序,同时保留密钥,并通过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;
});

你必须复制原始数组,因为arsort会对它指向的实际数组进行排序,而不是返回一个新数组。

答案 2 :(得分:0)

Dim StartDate As Date

For j = 1 To 10000
    StartDate = wbAs.Worksheets(i).Cells(j, 2).Value
    prProject.Tasks(i).Start = StartDate
    i = i + 1

答案 3 :(得分:0)

为了获得最佳效率,请尝试减少总函数调用;这尤其意味着最小化/消除迭代函数调用。

这是我对ahsan的回答稍微高效的版本。

代码:(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);

输出:

array (
  0 => 3,
  1 => 2,
  2 => 4,
  3 => 1,
)