迭代排序关联数组

时间:2019-06-11 08:52:08

标签: php arrays sorting

我有一个带有正整数值的数组,例如[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

如果我需要再解释一次:我的按键有问题。找到最接近的值不是问题。

2 个答案:

答案 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]];
    }
}