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

Задача:

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

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

Решение

Первый способ заключается в следующем. Мы перебираем все элементы массива и с помощью функции 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

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

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

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

var_dump($result);

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

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

<?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);