<?php

$recursive = array(42);
$recursive['recursive'] = &$recursive;

$deepRecursive = array(42);
$deepRecursive['this']['recursion']['happens']['deeper'] = $recursive; // just for fun

$nonrec = array(42);
$nonrec[] = $nonrec; // not recursive, this is a static copy of the array
 
 
echo "Recursive:      ".(int)is_recursive($recursive)."\n";
echo "Deep recursive: ".(int)is_recursive($deepRecursive)."\n";
echo "Non-recursive:  ".(int)is_recursive($nonrec)."\n";

function is_recursive(array &$array, array &$alreadySeen = array()) {
    static $uniqueObject;
    if (!$uniqueObject) {
        $uniqueObject = new stdClass;
    }

    $alreadySeen[] = &$array;

    foreach ($array as &$item) {
        if (!is_array($item)) {
            continue;
        }

        $item[] = $uniqueObject;
        $recursionDetected = false;
        foreach ($alreadySeen as $candidate) {
            if (end($candidate) === $uniqueObject) {
                $recursionDetected = true;
                break;
            }
        }

        array_pop($item);

        if ($recursionDetected || is_recursive($item, $alreadySeen)) {
            return true;
        }
    }

    return false;
}
