Сравните каждый индекс в одном массиве

У меня есть функция для расчета расстояния, данные берутся из базы данных.

Вот код для расчета:

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";
        }
    }
}

Результат, который я хочу, должен выглядеть так

if [0] <[1], то «высокий» и цикл для другого массива индексов, например [2] с [3], [4] с [5] и так далее.

Какого результата вы ожидаете?

Ankit Agarwal 24.08.2018 14:20

Я должен спросить, @Beadyyy. Это домашнее задание? И второе по важности: что вы пробовали?

Rafael 24.08.2018 14:26

@AnkitAgarwal обновленный вопрос

Beadyyy 24.08.2018 14:33

@Rafael нет, это не моя домашняя работа, и я пытался сделать много типов циклов, но это пошло не так (обновленный вопрос)

Beadyyy 24.08.2018 14:34

Ваша спецификация немного размыта - вам нужно найти пары индексов, между которыми есть наименьшее расстояние? Т.е. [0] - [2] и [1] - [3] будут иметь нулевое расстояние - будут ли эти пары индексов ответом на вашу проблему?

Agnius Vasiliauskas 24.08.2018 14:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
5
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Ответ принят как подходящий

Я думаю, что вы были довольно близки к тому, чего хотели достичь, но похоже, что вы усложняли задачу, чем они должны были быть.

Ваш код ниже.

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;
    }
}

Теперь вы можете изменить эхо на все, что хотите, и, вероятно, вам также следует добавить некоторую проверку (например, проверить, действительно ли существуют ключи перед доступом к ним), но это хорошее место для начала.

Другие вопросы по теме