我有一个这样的数组:
$row_arr_1=array(7,9,5,10);
现在我想得到像这样的结果数组:
$row_arr_2=array(3,2,4,1);
说明:
由于10
是row_arr_1
中的最大值,因此它将替换为值1.
同样,由于9
是row_arr_1
的第二高值,因此它将被替换为2,依此类推。
我尝试对row_arr_1
的值进行排序,但位置已更改。
如何 我可以得到我想要的结果吗?
答案 0 :(得分:3)
$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);
答案 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,
)