A teraz poparz i pomyśl jak Twoja funkcja mogła by wyglądać gdyby obsługiwała obiekty i/lub tablice:
function validate( $dane, $recursive = true ) {
if( $recursive ) {
//tutaj w pętli wywołamy validate($dane['klucz'] );
} else
return 'Error. Otrzymano tablicę. Wymagany skalar lub rekursywne ustawienie funkcji!';
if( $recursive ) {
//tutaj w pętli wywołamy validate($dane->klucz );
} else
return 'Error. Otrzymano obiekt. Wymagany skalar lub rekursywne ustawienie funkcji!';
} else {
//tutaj sobie walidujesz wartość;
}
}
Pętli i działań wewnętrznych nie będę rozpisywał, bo byś miał gotowca

Zazwyczaj w przypadku błędów zwraca się false, ale chciałem byś wiedział, dlaczego i jaki błąd jest. Zwróć tylko uwagę na użycie rekurencji, bo ona tutaj robi dobrą robotę. To taki szkic na szybko, byś w przyszłości miał nad czym się zastanowić

Domyślnie mam ustawione przeszukiwanie rekursywne, ale możesz przy wywołaniu dać false i wtedy tylko pojedynczą wartość sprawdzi. Możesz także kombinować z wyciąganiem sprawdzenia $recursive jako pierwszego by nieco próbować przyspieszać funkcję w przypadku skalarów (masz wtedy 1 if zamiast czekać aż sprawdzi czy jest to tablica lub obiekt).