Я бы предположил, что ваш $ ad_arr не массив. Вы можете проверить это с помощью функции is_array () или вызвав:
var_dump($ad_arr);
В выводе должен быть массив, а не строка (как уже упоминалось в Artefacto).
Еще один маленький совет:
Если вы хотите сохранить ассоциативный массив, вы можете использовать закодированную строку JSON, которую можно сохранить с помощью функции json_encode ():
setcookie('watched_ads', json_encode($ad_arr), $expir, '/');
А для загрузки данных вы можете использовать противоположную функцию json_decode ():
$ad_arr = json_decode($_COOKIE['watched_ads'], true);
Добавив true в качестве второго параметра, вы получите ассоциативный массив, а не объект. Использование формата JSON также является хорошей идеей для сохранения сложных данных в базе данных.
A и последний совет: "! In_array ()" работает так же хорошо, как "in_array () == FALSE"