Задача:
Проверить, есть ли в одномерном числовом массиве хотя бы одна пара противоположных чисел.
Противоположными считаются числа с разными знаками (например 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);