【问题标题】:Compare each index in single array比较单个数组中的每个索引
【发布时间】:2018-08-24 12:20:05
【问题描述】:

我有一个计算距离的功能,数据来自数据库。

计算代码如下:

function jarak() {
    global $conn;

    $query1 = mysqli_query($conn, "SELECT signature, sig_priority FROM centro");
    $query2 = mysqli_query($conn, "SELECT signature, sig_priority, status FROM acid_event");

    while ($row = mysqli_fetch_array($query1, MYSQLI_ASSOC)) { $master[]=$row; }
    while ($row = mysqli_fetch_array($query2, MYSQLI_ASSOC)) { $data[]=$row; }

    $jarak = array();
    foreach ($data as $key => $val) {
        foreach ($master as $key2 => $value) {
            $jarak = sprintf("%0.2f",sqrt(pow($val['signature'] - $value['signature'], 2) + pow($val['sig_priority'] - $value['sig_priority'], 2)));
            echo "distance from (" . $value['signature'] . "," . $value['sig_priority'] . ") ke (" . $val['signature'] . "," . $val['sig_priority'] . ") is :  " . $jarak . "<br>";
            $euc[]=$jarak;  
        }
    }
}

结果如下:

Array( 
[0] => 30.04 
[1] => 0.00 
[2] => 30.04 
[3] => 0.00 
[4] => 47.00 
[5] => 17.03 
[6] => 5.02
[7] => 25.08 
[8] => 2.06 
[9] => 32.06 
[10] => 37.00 
[11] => 7.07 )

我想将每个 2 个索引数组与大于或小于进行比较。 示例:[0] 与 [1]、[2] 与 [3]、[4] 与 [5] 等等。它只是与 2 指数比较。

我试过了,但没有结果

for ($i=0; $i<count($cb); $i++) {
    for ($k=0;$k<2;$k++) {
        if($cb[$i][$k]<$cb[$i][$k]) {
            echo "low";
        } elseif ($cb[$i][$k]>$cb[$i][$k]) {
            echo "high";
        }
    }
}

我想要的输出应该是这样的

如果 [0]

【问题讨论】:

  • 你期望的输出是什么?
  • 我得问一下,@Beadyyy。这是作业吗?第二个最重要的:你尝试过什么?
  • @AnkitAgarwal 更新问题
  • @Rafael 不,这不是我的作业,我试图做很多类型的循环但它出错了(更新的问题)
  • 您的规范有点模糊-您需要找到之间距离最小的索引对吗? IE。 [0]-[2] 和 [1]-[3] 的距离为零 - 这些索引对可以解决您的问题吗?

标签: php arrays compare


【解决方案1】:

我认为您已经非常接近您想要完成的目标,但似乎您让事情变得比他们需要的更难。

您的代码如下。

for ($i=0; $i<count($cb); $i++) {
    for ($k=0;$k<2;$k++) {
        if($cb[$i][$k]<$cb[$i][$k]) {
            echo "low";
        } elseif ($cb[$i][$k]>$cb[$i][$k]) {
            echo "high";
        }
    }
}

如您所见,您的 if 语句将完全相同的值相互比较,这并不会起到太大作用。但我可以看到你在第二个 for 循环中试图做什么。

相反,我们真正想做的是以 2 步移动数组。

for ($i=0; $i<count($cb); $i+=2) {
    //stuff
}

这样我们可以比较第一个元素和之后的元素。像这样:

if($cb[$i] > $cb[$i+1]) {
    echo $i . 'is higher than '. $i+1;
} elseif($cb[$i] < $cb[$i+1]) {
    echo $i . 'is lower than '. $i+1;
} else {
    echo $i . 'is the same as '. $i+1;
}

所以总的来说,它会是这样的:

for ($i=0; $i<count($cb); $i+=2) {
    if($cb[$i] > $cb[$i+1]) {
        echo $i . 'is higher than '. $i+1;
    } elseif($cb[$i] < $cb[$i+1]) {
        echo $i . 'is lower than '. $i+1;
    } else {
        echo $i . 'is the same as '. $i+1;
    }
}

现在您可以将回显更改为您想要执行的任何操作,并且您可能还应该添加一些验证(例如在访问密钥之前检查密钥是否确实存在),但这是开始的好地方。

【讨论】:

    【解决方案2】:

    我做了一个解决方案,但我决定将响应保存在一个数组中,因为以后能够在其他地方读取这些信息对我来说更有意义。

    这是我的解决方案:

    $test = array( 
        30.04, 
        0.00, 
        30.04, 
        0.00, 
        47.00, 
        17.03, 
        5.02, 
        25.08, 
        2.06, 
        32.06, 
        37.00, 
        7.07,
    );
    
    $output = array();
    foreach ($test as $key => $value) {
        // To make sure this will only be executed every second item
        if ($key % 2 !== 0) {
            continue;
        }
        $next = '';
        if (!isset($test[$key+1])) {
            break;
        } else {
            $next = $test[$key+1];
        }
    
        $output[$key] = $value . ' is ' . ($value < $next 
            ? "lower" 
            : ($value > $next 
               ? 'higher'
               : 'equal')) . ' than ' . $next;
    }
    
    echo '<pre>';
    print_r($output);
    

    这是测试的代码:https://3v4l.org/Pg5La

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2021-04-17
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多