我有一个带有正整数值的数组,例如[4, 1, 75, 52, 5, 24]
。我需要找到差异最小的两个值。另外,我需要这两个的原始密钥。因此,我用asort()
对数组进行了排序以保留键。现在,当我进行迭代时,我遇到了一个问题-我无法使用$key + 1
指向下一个元素,并且使用next()
和prev()
会使获取密钥变得困难(一旦使用next或上一页指针已移动):
for ($i = 0; $i < count($sorted)-1; $i++) {
if (current($sorted) - next($sorted) < $min) {
//echo prev($sorted) - next($sorted) . '<br>';
}
}
你会怎么做?
(如果这样可以更轻松地随意更改任何其他形式的数组-不需要asort
)
如果我需要再解释一次:我的按键有问题。找到最接近的值不是问题。
答案 0 :(得分:0)
我彻底修改了您的代码段。您可以从以下代码片段中提取所需内容,
$array = [4, 1, 5, 52, 75, 52, 24];
function difference($arr)
{
$n = count($arr);
// Initialize difference
// as infinite
$diff = PHP_INT_MAX;
// Find the min diff by comparing
// difference of all possible
// pairs in given array
$two_values = [];
for ($i = 0; $i < $n - 1; $i++) {
for ($j = $i + 1; $j < $n; $j++) {
if (abs($arr[$i] - $arr[$j]) < $diff) {
$diff = abs($arr[$i] - $arr[$j]);
$two_values['values'] = [$arr[$i], $arr[$j]];
$two_values['keys'] = [$i, $j];
$two_values['diff'] = $diff;
}
}
}
// Return min diff
return $two_values;
}
print_r(difference($array));
Demo。
请告诉我是否有问题。
答案 1 :(得分:0)
我找到了使用带有键和array_multisort()
$numbers = [4, 1, 75, 1, 52, 5, 52, 24, 52];
$ar = [];
$mins = [];
$min = PHP_INT_MAX;
foreach ($numbers as $key => $number) {
$ar[] = ['key' => $key, 'number' => $number];
}
array_multisort(array_column($ar, 'number'), SORT_DESC, array_column($ar, 'key'), SORT_DESC, $ar );
foreach ($ar as $key => $value) {
if (!isset($ar[$key + 1])) break;
if ($value['number'] - $ar[$key + 1]['number'] <= $min) {
$min = $value['number'] - $ar[$key + 1]['number'];
$mins = [$ar[$key + 1], $ar[$key]];
}
}