对已排序的关联数组进行迭代

I have array with positive int values like [4, 1, 75, 52, 5, 24]. I need to find two values with minimal difference. Also, I need the original keys of those two. So, I sorted the array with asort() to keep the keys. Now when I iterate I have a problem - I can't use $key + 1 to point to next element and using next() and prev() makes it difficult to get the keys (once you use next or prev pointer is moved):

for ($i = 0; $i < count($sorted)-1; $i++) {
  if (current($sorted) - next($sorted) < $min) {
    //echo prev($sorted) - next($sorted) . '<br>'; 
  }
}

What would you do?
(Feel free to alter array in any other form if that makes this easier - asort is not necessary)

If I need to explain one more time: I have a problem with keys. Finding the closest values is not a problem.

展开翻译

译文

我的数组具有正整数值,如 [4,1,75,52,5,24] </代码>。 我需要找到两个差异最小的值。 另外,我需要这两个的原始密钥。 因此,我使用 asort()</ code>对数组进行排序以保留密钥。 现在当我迭代我有问题 - 我不能使用 $ key + 1 </ code>指向下一个元素并使用 next()</ code>和 prev()< / code>使得很难获得密钥(一旦你使用next或prev指针被移动):</ p>

  for($ i = 0; $ i&lt; count($ 已排序)-1; $ i ++){
if(current($ sorted) - next($ sorted)&lt; $ min){
// echo echo($ sorted) - next($ sorted)。 '&LT峰; br&GT;';

}
}
</ code> </ pre>

你会做什么?

(如果这样可以更容易改变任何其他形式的数组 - < 代码> asort </ code>不是必需的)</ p>

如果我需要再解释一次:我的密钥有问题。 找到最接近的值不是问题。</ p>
</ div>

dongpao5127
dongpao5127 如果我的答案不符合您的期望,请告诉我,我会很乐意删除它:)。
5 个月之前 回复
dongzen5577
dongzen5577 可能重复查找数组中匹配或最接近的值
5 个月之前 回复

2个回答

I completely revamped your snippet. You can take whatever you want from below snippet,

$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.

Please let me know if something is not getting.

展开翻译

译文



我完全修改了你的代码片段。 您可以从下面的代码段中获取您想要的任何内容,</ p>

  $ array = [4,1,5,52,75,52,24]; 
功能差异($ arr)

{
$ n = count($ arr);
//初始化差异
//为无限
$ diff = PHP_INT_MAX;
//通过比较
//差异查找最小差异 可能
//在给定数组中成对
$ two_values = [];
for($ i = 0; $ i&lt; $ n - 1; $ i ++){
for($ j = $ i + 1 ; $ j&lt; $ n; $ j ++){
if(abs($ arr [$ i] - $ arr [$ j])&lt; $ diff){
$ diff = abs($ arr [$ i ] - $ arr [$ j]);
$ two_values ['values'] = [$ arr [$ i],$ arr [$ j]];
$ two_values ['keys'] = [$ i, $ j];
$ two_values ['diff'] = $ diff;
}
}
}

//返回min diff
返回$ two_values;
}
nprint_r(差异($) array));
</ code> </ pre>

演示。< / p>

如果没有收到,请告诉我。</ p>
</ div>

doufan6033
doufan6033 现在检查我完全改变了片段。
5 个月之前 回复
dongyuan7981
dongyuan7981 我再次检查,给我一些时间。
5 个月之前 回复
duanrenzou1619
duanrenzou1619 但我想你给了我一个主意。 我可能会创建具有原始键和值的数组。 这可能有所帮助。 并迭代[0 => ['original_key'=> 1,'value'=> 1],1 => ['original_key'=> 0,'value'=> 4] ...]。 这样我可以使用$ array [$ key + 1] ['value']来获取下一个值,$ array [$ key + 1] ['original_key']将返回初始键值
5 个月之前 回复
duanpu2272
duanpu2272 你是对的! 我得到了你的关注,让我重新考虑一下片段。
5 个月之前 回复
doukezi4576
doukezi4576 有一个解决方法,我更新了我的答案。 请立即检查。
5 个月之前 回复
douzhe3516
douzhe3516 该array_search不足以始终定位正确的密钥。 如果您尝试像[4,1,5,52,75,52,24]这样的数组,您将获得两个52值的相同键。
5 个月之前 回复

I found my own way to do this using additional array with keys and 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]];
    }
}

展开翻译

译文



我找到了自己的方法,使用带键的附加数组和 array_multisort()</ code> </ p>

  $ numbers = [4,1,75,1,52,5,52,24,52]; 
$ ar = [];
$ mins = []; \ n $ min = PHP_INT_MAX;
foreach($ numbers as $ key =&gt; $ number){
$ ar [] = ['key'=&gt; $ key,'number'=&gt; $ number];
}

array_multisort(array_column($ ar,'number'),SORT_DESC,array_column($ ar,'key'),SORT_DESC,$ ar);

foreach($ ar as $ key =&gt; $ value){
if(!isset($ ar [$ key + 1]))break;
if($ value ['number'] - $ ar [$ key + 1] ['number' ]&lt; = $ min){
$ min = $ value ['number'] - $ ar [$ key + 1] ['number'];
$ mins = [$ ar [$ key + 1], $ ar [$ key]];
}
}
</ code> </ pre>
</ div>

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

5
javascrpt语言,sort方法传递函数,函数有2个参数为迭代到的数字,怎么得到这个函数的调用?
1
牛顿迭代法的MATLAB程序,为什么无论输什么初始值,得到的结果f都为零呀?
2
BP神经网络模型,如果要预测数据,是每一个数据都迭代N次吗?
3
关于迭代的问题,求详细代码
2
Java ListIterator关于逆向迭代器的问题?
0
日期迭代与货物迭代问题
1
matlab如何将jacobi迭代求解线性方程组时的每次迭代误差用matlab绘出?
2
请问 tensorflow 在训练网络过程中,如何在使用验证集进行验证时,不 让权值发生变化?
0
六个整数多次迭代计算结果的值,用C语言的编程方法实现的方式
1
tensorflow如何在训练一定迭代次数后停止对某个参数的训练,而继续对其他参数进行训练?
1
RNN 展开实现LSTM按时间步迭代时,有必要令reuse=true么?
0
数字的多次的迭代的算法的问题的解决的方式,用的是C程序的语言的编写的过程怎么做
0
卷积神经网络测试集准确率很低且不变?
0
全变分迭代代码中式子具体所代表的是什么?
0
C++中swap成员函数对迭代器的影响
0
进程池复用后,连同上一进程的数据也迭代了,导致最终数据重复好多。
0
数字的迭代循环匹配问题,怎么利用C语言的程序的代码的编写从而实现这个问题求解?
3
c++ 迭代器 erase之后出了问题,已解决,但不知道我错误的原因
0
通过循环迭代计算e的值,怎么利用C语言的程序代码编写的方式进行程序的编写的?
0
c语言编的粒子群算法,迭代过程中目标函数值一直不变