My answer is based on your code and your question, but I would like to frighten you that I found the logic of the line that sets the $ variable variable too confusing.
I basically used the rand (int min, int max) function to sort numbers and return 'failed' or NULL randomly.
<?php
function funcao()
{
// sorteia um número $n entre 1 ou 2 aleatoriamente
$n = rand (1 , 2);
// se o $n sorteado for igual a 1, retorna 'falhou'
// se o $n sorteado for igual a 2, retorna NULL
if($n==1)
{
return 'falhou';
}
else
{
return NULL;
}
}
$array = [1,2];
$i = 0;
foreach ($array as $value)
{
$retorno[$i] = funcao();
$i++;
}
echo "Conteudo do array: ";
echo var_dump($retorno);
echo "</br>";
// ATENÇÃO: A lógica dessa linha abaixo é muito confusa e acho que vc deveria reescrevê-la para algo mais inteligível.
// A função array_search retorna o q foi procurado, ou false se não achar o que procurou.
// O terceiro parâmetro com valor false diz para não comparar tipo*
// Testei aqui e:
// $valido será true se ambos os elementos em retorno forem iguais a 'falhou'
// $valido será false em demais casos, isso pq null é considerado um equivalente de false quando não se verifica tipo
// se o terceiro parâmetro estivesse como true:
// $valido sempre seria true pq array_search sempre iria falhar e retornaria false que é === false e a comparação retorna true.
$valido = false === array_search(false , $retorno, true);
echo "Teste: ";
var_dump($valido);