fork(3) download
  1. <?php
  2.  
  3. $recursive = array(42);
  4. $recursive['recursive'] = &$recursive;
  5.  
  6. $deepRecursive = array(42);
  7. $deepRecursive['this']['recursion']['happens']['deeper'] = $recursive; // just for fun
  8.  
  9. $nonrec = array(42);
  10. $nonrec[] = $nonrec; // not recursive, this is a static copy of the array
  11.  
  12.  
  13. echo "Recursive: ".(int)is_recursive($recursive)."\n";
  14. echo "Deep recursive: ".(int)is_recursive($deepRecursive)."\n";
  15. echo "Non-recursive: ".(int)is_recursive($nonrec)."\n";
  16.  
  17. function is_recursive(array &$array, array &$alreadySeen = array()) {
  18. static $uniqueObject;
  19. if (!$uniqueObject) {
  20. $uniqueObject = new stdClass;
  21. }
  22.  
  23. $alreadySeen[] = &$array;
  24.  
  25. foreach ($array as &$item) {
  26. if (!is_array($item)) {
  27. continue;
  28. }
  29.  
  30. $item[] = $uniqueObject;
  31. $recursionDetected = false;
  32. foreach ($alreadySeen as $candidate) {
  33. if (end($candidate) === $uniqueObject) {
  34. $recursionDetected = true;
  35. break;
  36. }
  37. }
  38.  
  39. array_pop($item);
  40.  
  41. if ($recursionDetected || is_recursive($item, $alreadySeen)) {
  42. return true;
  43. }
  44. }
  45.  
  46. return false;
  47. }
  48.  
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
Recursive:      1
Deep recursive: 1
Non-recursive:  0