Поиск противоположных чисел в массиве

Александр Кичатов

Задача:

Проверить, есть ли в одномерном числовом массиве хотя бы одна пара противоположных чисел.

Противоположными считаются числа с разными знаками (например 20 и -20).

Решение 1

Перебираем все элементы массива и с помощью функции in_array() проверяем существование элемента с противоположным знаком:

<?php
$arr = [10, 20, 30, -20];
$result = false;

foreach($arr as $v)
{
    if(in_array(-$v, $arr))
    {
        $result = true;
        break;
    }
}

var_dump($result); // true

Решение 2

Второй способ немного сложней. Мы запускаем два цикла, один внутри другого, по одному и тому же массиву. И в каждой итерации цикла проверяем, являются ли два текущих значения противоположными.

Таким образом, мы сравниваем каждое число массива со всеми остальными.

<?php
$arr = [10, 20, 30, -20];
$result = false;

foreach($arr as $k1 => $v1)
{
    foreach($arr as $k2 => $v2)
    {
        if($v1 === -$v2)
        {
            $result = true;
            break 2; // Прерываем сразу 2 цикла
        }
    }
}

var_dump($result); // bool(true)

В этом решении есть один минус - при наличии в массиве $arr числа 0 скрипт выведет true потому что 0 считается противоположным самому себе, т.е. числа 0 и -0 считаются равными.

Чтобы этого избежать, добавим ещё одно условие $k1 !== $k2, т.е. не сравнивать число с самим собой:

<?php
$arr = [10, 20, 30, -20];
$result = false;

foreach($arr as $k1 => $v1)
{
    foreach($arr as $k2 => $v2)
    {
        if($k1 !== $k2 and $v1 === -$v2)
        {
            $result = true;
            break 2;
        }
    }
}

var_dump($result);

Комментарии