Search code examples
phparraysfunctionrecursionvar-dump

How Can I show Multidimensional Arrays (2D,3D,4D and more) like var_dump with loops and echo in PHP?


This is my array :

$arr=array(
    array(
      array(array( "value1", "value2" ), "value2" ),
      array( "value3", "value4" )
    ),
    array(
      array( "value5", "value6" ),
      array( "value7", "value8" )
    )
  );

if we print that with var_dump it shows like below :

array(2) {
  [0]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      array(2) {
        [0]=>
        string(6) "value1"
        [1]=>
        string(6) "value2"
      }
      [1]=>
      string(6) "value2"
    }
    [1]=>
    array(2) {
      [0]=>
      string(6) "value3"
      [1]=>
      string(6) "value4"
    }
  }
  [1]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      string(6) "value5"
      [1]=>
      string(6) "value6"
    }
    [1]=>
    array(2) {
      [0]=>
      string(6) "value7"
      [1]=>
      string(6) "value8"
    }
  }
}

I want to write a function that can print every multidimensional Arrays only with echo and loops, how can i do this?

this is my code :

function recursive($array)
    {
        foreach ($array as $key => $value) {
            //If $value is an array.
            if (is_array($value)) {
                //We need to loop through it.
                recursive($value);
            } else {
                if (gettype($value)!=="string") {
                    //It is not an array, so print it out.
                    echo $key . ": " .gettype($value).count($value). $value, '<br>';
                } else {
                    echo "[".$key . "]=>" .gettype($value)."(".strlen($value).") \"". $value."\"", '<br>';
                }
            }
        }
    }
    recursive($arr);

and this is the output :

[0]=>string(6) "value1"
[1]=>string(6) "value2"
[1]=>string(6) "value2"
[0]=>string(6) "value3"
[1]=>string(6) "value4"
[0]=>string(6) "value5"
[1]=>string(6) "value6"
[0]=>string(6) "value7"
[1]=>string(6) "value8"

this code can't print like var_dump!

I want to print like var_dump by my function , how can i do this work?


Solution

  • function var_debug($variable,$strlen=100,$width=25,$depth=10,$i=0,&$objects = array())
    {
      $search = array("\0", "\a", "\b", "\f", "\n", "\r", "\t", "\v");
      $replace = array('\0', '\a', '\b', '\f', '\n', '\r', '\t', '\v');
    
      $string = '';
    
      switch(gettype($variable)) {
        case 'boolean':      $string.= $variable?'true':'false'; break;
        case 'integer':      $string.= $variable;                break;
        case 'double':       $string.= $variable;                break;
        case 'resource':     $string.= '[resource]';             break;
        case 'NULL':         $string.= "null";                   break;
        case 'unknown type': $string.= '???';                    break;
        case 'string':
          $len = strlen($variable);
          $variable = str_replace($search,$replace,substr($variable,0,$strlen),$count);
          $variable = substr($variable,0,$strlen);
          if ($len<$strlen) $string.= '"'.$variable.'"';
          else $string.= 'string('.$len.'): "'.$variable.'"...';
          break;
        case 'array':
          $len = count($variable);
          if ($i==$depth) $string.= 'array('.$len.') {...}';
          elseif(!$len) $string.= 'array(0) {}';
          else {
            $keys = array_keys($variable);
            $spaces = str_repeat(' ',$i*2);
            $string.= "array($len)\n".$spaces.'{';
            $count=0;
            foreach($keys as $key) {
              if ($count==$width) {
                $string.= "\n".$spaces."  ...";
                break;
              }
              $string.= "\n".$spaces."  [$key] => ";
              $string.= var_debug($variable[$key],$strlen,$width,$depth,$i+1,$objects);
              $count++;
            }
            $string.="\n".$spaces.'}';
          }
          break;
        case 'object':
          $id = array_search($variable,$objects,true);
          if ($id!==false)
            $string.=get_class($variable).'#'.($id+1).' {...}';
          else if($i==$depth)
            $string.=get_class($variable).' {...}';
          else {
            $id = array_push($objects,$variable);
            $array = (array)$variable;
            $spaces = str_repeat(' ',$i*2);
            $string.= get_class($variable)."#$id\n".$spaces.'{';
            $properties = array_keys($array);
            foreach($properties as $property) {
              $name = str_replace("\0",':',trim($property));
              $string.= "\n".$spaces."  [$name] => ";
              $string.= var_debug($array[$property],$strlen,$width,$depth,$i+1,$objects);
            }
            $string.= "\n".$spaces.'}';
          }
          break;
      }
    
      if ($i>0) return $string;
    
      $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
      do $caller = array_shift($backtrace); while ($caller && !isset($caller['file']));
      if ($caller) $string = $caller['file'].':'.$caller['line']."\n".$string;
    
      echo $string;
    }
    

    https://3v4l.org/aCmrD

    credit: https://www.leaseweb.com/labs/2013/10/smart-alternative-phps-var_dump-function/