PHP сдвиг в массиве иерархии - PullRequest
0 голосов
/ 29 октября 2010

У меня есть следующий массив:

Array(
   [id] => 1
   [children] => Array(
      [2] => Array(
         [id] => 2
         [inactive] => true
         [children] => Array(
            [4] => Array(
               [id] => 4
               [children] => Array()
            )
         )
      )
      [3] => array(
         [id] => 3
         [children] => Array(
            [5] => Array(
               [id] => 5
               [inactive] => true
               [children] => Array()
            )
         )
      )
   )
)

Мне нужно удалить элементы из этого массива, которые имеют [inactive] = true.Но моя проблема в следующем.Я должен сдвинуть элементы массива.Вывод должен быть:

Array(
   [id] => 1
   [children] => Array(
      [4] => Array(
         [id] => 4
         [children] => Array()
      )
      [3] => array(
         [id] => 3
         [children] => Array(
         )
      )
   )
)

Это моя функция.Но он удаляет элемент массива со всеми его подэлементами.

public function deleteInactive($userTree)
{
    if (!empty($userTree)) {
        foreach($userTree['children'] as $userId => &$user) {
            if (array_key_exists('inactive', $user)) {
                $userTree['children'] += $user['children'];
                unset($userTree['children'][$userId]);
                $this->deleteInactive($userTree);
                break;
            }
            $this->deleteInactive($user);
        }
    }
    return $userTree;
}

Можете ли вы помочь мне изменить эту функцию?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Попробуйте эту функцию, она должна делать, как вы просили.

<?php
function deleteInactive($children) {
    $copy = $children;
    foreach ($copy as $key => $child) {
        if (!empty($child['inactive']) && $child['inactive'] === true) {
            unset($children[$key]);
            $children = deleteInactive($child['children']);
        } elseif (!empty($child['children']) && is_array($child['children'])) {
            $children[$key]['children'] = deleteInactive($child['children']);
        }
    }
    return $children;
} ?>

Ваш ПЕРВЫЙ массив ДОЛЖЕН быть также допустимым дочерним массивом, вы можете вызывать его так, как если бы вы указали свой массив.

deleteInactive(array('1' => $array));
1 голос
/ 29 октября 2010

Перед удалением узла необходимо прикрепить дочерние элементы к родительскому узлу. Этого не происходит (код только сбрасывается), поэтому дети теряются.

...