vote up 1 vote down star
1

Per the example array at the very bottom, i want to be able to append the depth of each embedded array inside of the array. for example:

    array (
      53 => 
      array (
        'title' => 'Home',
        'path' => '',
        'type' => '118',
        'pid' => 52,
        'hasChildren' => 0,
      ),

Has a depth of one according to the sample array shown below so it should now look like this:

    array (
      53 => 
      array (
        'title' => 'Home',
        'path' => '',
        'type' => '118',
        'pid' => 52,
        'hasChildren' => 0,
        'depth' => 1,
      ),

and so on...

All of the recursive array function attempts i have made are pretty embarrassing. However I have looked at RecursiveArrayIterator which has the getDepth function. I'm confused on how to append it to the current array... any help is VERY much appreciated, thank you.

 
  array (
    'title' => 'Website Navigation',
    'path' => '',
    'type' => '115',
    'pid' => 0,
    'hasChildren' => 1,
    'children' => 
    array (
      53 => 
      array (
        'title' => 'Home',
        'path' => '',
        'type' => '118',
        'pid' => 52,
        'hasChildren' => 0,
      ),
      54 => 
      array (
        'title' => 'Features',
        'path' => 'features',
        'type' => '374',
        'pid' => 52,
        'hasChildren' => 1,
        'children' => 
        array (
          59 => 
          array (
            'title' => 'artistic',
            'path' => 'features/artistic',
            'type' => '374',
            'pid' => 54,
            'hasChildren' => 1,
            'children' => 
            array (
              63 => 
              array (
                'title' => 'galleries',
                'path' => 'features/artistic/galleries',
                'type' => '374',
                'pid' => 59,
                'hasChildren' => 1,
                'children' => 
                array (
                  65 => 
                  array (
                    'title' => 'graphics',
                    'path' => 'features/artistic/galleries/graphics',
                    'type' => '118',
                    'pid' => 63,
                    'hasChildren' => 0,
                  ),
                  67 => 
                  array (
                    'title' => 'mixed medium',
                    'path' => 'features/artistic/galleries/mixed-medium',
                    'type' => '118',
                    'pid' => 63,
                    'hasChildren' => 0,
                  ),
                  64 => 
                  array (
                    'title' => 'overview',
                    'path' => 'features/artistic/galleries',
                    'type' => '118',
                    'pid' => 63,
                    'hasChildren' => 0,
                  ),
                  68 => 
                  array (
                    'title' => 'photography',
                    'path' => 'features/artistic/galleries/photography',
                    'type' => '118',
                    'pid' => 63,
                    'hasChildren' => 0,
                  ),
                  66 => 
                  array (
                    'title' => 'traditional',
                    'path' => 'features/artistic/galleries/traditional',
                    'type' => '118',
                    'pid' => 63,
                    'hasChildren' => 0,
                  ),
                ),
              ),
              62 => 
              array (
                'title' => 'overview',
                'path' => 'features/artistic',
                'type' => '118',
                'pid' => 59,
                'hasChildren' => 0,
              ),
              69 => 
              array (
                'title' => 'tutorials',
                'path' => 'features/artistic/tutorials',
                'type' => '374',
                'pid' => 59,
                'hasChildren' => 1,
                'children' => 
                array (
                  71 => 
                  array (
                    'title' => 'by category',
                    'path' => 'features/artistic/tutorials/by-category/',
                    'type' => '118',
                    'pid' => 69,
                    'hasChildren' => 0,
                  ),
                  72 => 
                  array (
                    'title' => 'by date',
                    'path' => 'features/artistic/tutorials/by-date/',
                    'type' => '118',
                    'pid' => 69,
                    'hasChildren' => 0,
                  ),
                  70 => 
                  array (
                    'title' => 'overview',
                    'path' => 'features/artistic/tutorials',
                    'type' => '118',
                    'pid' => 69,
                    'hasChildren' => 0,
                  ),
                ),
              ),
            ),
          ),
          58 => 
          array (
            'title' => 'overview',
            'path' => 'features',
            'type' => '118',
            'pid' => 54,
            'hasChildren' => 0,
          ),
          61 => 
          array (
            'title' => 'projects / labs',
            'path' => 'features/projects-labs/',
            'type' => '374',
            'pid' => 54,
            'hasChildren' => 0,
          ),
          60 => 
          array (
            'title' => 'web development',
            'path' => 'features/web-development',
            'type' => '374',
            'pid' => 54,
            'hasChildren' => 1,
            'children' => 
            array (
              74 => 
              array (
                'title' => 'articles',
                'path' => 'features/web-development/articles/',
                'type' => '374',
                'pid' => 60,
                'hasChildren' => 0,
              ),
              73 => 
              array (
                'title' => 'overview',
                'path' => 'features/web-development',
                'type' => '118',
                'pid' => 60,
                'hasChildren' => 0,
              ),
              75 => 
              array (
                'title' => 'tutorials',
                'path' => 'features/web-development/tutorials',
                'type' => '374',
                'pid' => 60,
                'hasChildren' => 0,
              ),
            ),
          ),
        ),
      ),
      55 => 
      array (
        'title' => 'Activity',
        'path' => 'activity',
        'type' => '374',
        'pid' => 52,
        'hasChildren' => 0,
      ),
      56 => 
      array (
        'title' => 'Blog',
        'path' => 'blog',
        'type' => '374',
        'pid' => 52,
        'hasChildren' => 0,
      ),
      57 => 
      array (
        'title' => 'About',
        'path' => 'about',
        'type' => '374',
        'pid' => 52,
        'hasChildren' => 1,
        'children' => 
        array (
          76 => 
          array (
            'title' => 'the author',
            'path' => 'about/the-author',
            'type' => '118',
            'pid' => 57,
            'hasChildren' => 0,
          ),
          77 => 
          array (
            'title' => 'the website',
            'path' => 'about/the-website',
            'type' => '118',
            'pid' => 57,
            'hasChildren' => 0,
          ),
        ),
      ),
    ),
  ),
);

print_r($example);

?>
flag

7 Answers

vote up 3 vote down check

I assume there is another array( at the top not included in your example code. Something like this?

function array_set_depth($array, $depth = -1)
{
  $subdepth = $depth + 1;
  if ($depth < 0) {
    foreach ($array as $key => $subarray) {
      $temp[$key] = array_set_depth(($subarray), $subdepth);
    }
  }
  if ($array['hasChildren'] && isset($array['children'])) {
    foreach ($array['children'] as $key => $subarray) {
      $temp[$key] = array_set_depth($subarray, $subdepth);
    }
    $array['children'] = $temp;
  }
  $array['depth'] = $depth;
  return $array;
}

Example usage, I set your array to the value $a:

$b = array_set_depth($a);
print_r($b);

Edit:

To set depth before the children for nice printing you can do this:

function array_set_depth($array, $depth = -1)
{
  $subdepth = $depth + 1;
  if ($depth < 0) {
    foreach ($array as $key => $subarray) {
      $temp[$key] = array_set_depth(($subarray), $subdepth);
    }
    return $temp;
  }
  $array['depth'] = $depth;
  if ($array['hasChildren'] && isset($array['children'])) {
    foreach ($array['children'] as $key => $subarray) {
      $temp[$key] = array_set_depth($subarray, $subdepth);
    }
    unset($array['children']);
    $array['children'] = $temp;
  }
  return $array;
}
link|flag
vote up 1 vote down

Modified Pauls code to work with this example.

function setDepth(&$a, $depth = -1)
{
    if (($depth > -1) && !($depth % 2))
      $a['depth']= $depth / 2;
    foreach($a as $key=>$value)
    {
        if (is_array($value))
           setDepth($a[$key], $depth+1);
    }

}
setDepth($a);
print_r($a);
link|flag
vote up 0 vote down

outstanding, thanks OIS.

link|flag
vote up 0 vote down

empi, i'm not able to get that code to work on the sample array

link|flag
vote up 0 vote down

OIS thats close... holy crap you guys are good. But if you try it out on my sample array there [54],[59], etc... have no depth where they should. looks like depth is only being applied to items with no children the depth should be applied to all the items whether they have children or not.

link|flag
Yes it does. But if you use print_r the depth value is below all the children. – OIS Jan 12 '09 at 12:21
I have added another version which will set the depth value above the children. – OIS Jan 12 '09 at 12:31
vote up 0 vote down

sth like this should do the trick:

function setdepth($arr, $depth = 0)
{
    foreach ($arr as $key => $val)
    {
    	$arr[$key]['depth'] = $depth;
    	if ($arr[$key]['hasChildren'])
    	{
    		setdepth(&$arr[$key]['children'], $depth+1);
    	}
    }
}

i would be easier if your array started with index not with values, so example usage could be like this:

$arr[0] = $website;
setdepth(&$arr, 0);

where website is the array from your example

link|flag
@youdontmeanmuch - do you get any errors? the result is in the $arr variable – empi Jan 12 '09 at 12:26
vote up 3 vote down

A recursive function like this should do it?

function setDepth(&$a, $depth)
{
    $a['depth']=$depth;
    foreach($a as $key=>$value)
    {
        if (is_array($value))
           setDepth($a[$key], $depth+1);
    }

}

The thing to note is that the array is passed by reference, so that we can modify it. Note that we also use this reference in the recursive call to setDepth. Although I used foreach for convenience, the $value variable is a copy, and passing that to setDepth would only make short lived changes within the scope of the foreach loop.

link|flag
Thats a generic recursive function for arrays. Need some work for this example. – OIS Jan 12 '09 at 13:12
I modified your code to work like it should. Dunno how to post it. – OIS Jan 12 '09 at 13:19

Your Answer

Get an OpenID
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.