Массивы PHP, рекурсивно добавляющие глубину элемента массива в массив с ключом 'глубина'

StackOverflow https://stackoverflow.com/questions/435180

Вопрос

В соответствии с примером массива в самом низу, я хочу иметь возможность добавлять глубину каждого встроенного массива внутри массива. например:

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

Имеет глубину один в соответствии с образцом массива, показанным ниже, поэтому теперь он должен выглядеть следующим образом:

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

и так далее ...

Все попытки рекурсивного массива, которые я сделал, довольно смущают. Однако я посмотрел на RecursiveArrayIterator, который имеет функцию getDepth. Я запутался в том, как добавить его в текущий массив ... любая помощь ОЧЕНЬ высоко ценится, спасибо.

 
  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);

?>
Это было полезно?

Решение

Я предполагаю, что есть другой массив (вверху, не включенный в ваш пример кода. Как то так?

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;
}

В качестве примера использования я установил для вашего массива значение $ a:

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

Изменить.

Чтобы установить глубину перед детьми для хорошей печати, вы можете сделать это:

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;
}

Другие советы

Такая рекурсивная функция должна это делать?

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

}

Следует отметить, что массив передается по ссылке, чтобы мы могли его изменить. Обратите внимание, что мы также используем эту ссылку в рекурсивном вызове setDepth. Хотя для удобства я использовал foreach, переменная $ value является копией, и передача ее в setDepth приведет только к кратковременным изменениям в рамках цикла foreach.

Изменен код Паулса для работы с этим примером.

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);

Что-то вроде этого должно помочь:

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

Мне было бы проще, если бы ваш массив начинался с индекса, а не со значений, поэтому пример использования может быть таким:

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

где сайт - это массив из вашего примера

Это может быть полезно:

function extend( $arr, $myArr=array() ) {

    foreach( $arr as $key => $value ) {
        if( is_array( $key ) ) {
            extend( $arr[ $key ] );
        } else {
            $myArr[ $key ] = $arr[ $key ];
        }
    }

    return $myArr;
}

Функция называется "продлить" поскольку он не только копирует массив в новый, он также может расширять существующие массивы.

Чтобы расширить массив, вы должны поместить его в качестве второго параметра, в противном случае - пустой массив. Функция просматривает свойства массива и проверяет, является ли он массивом или нет, и если это функция вызывается снова, в противном случае она копирует значения в другой массив и возвращает его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top