Массив фильтрация PHP - PullRequest
1 голос
/ 01 июня 2010

У меня есть массив со значениями вроде:

Array
(
    [0] => Array
        (
            [parent] => Basic
            [parentId] => 1
            [child] => Birthday
            [childId] => 2
        )

    [1] => Array
        (
            [parent] => Basic
            [parentId] => 1
            [child] => Gender
            [childId] => 3
        )

    [2] => Array
        (
            [parent] => Geo
            [parentId] => 10
            [child] => Current City
            [childId] => 11
        )

    [3] => Array
        (
            [parent] => Known me
            [parentId] => 5
            [child] => My personality
            [childId] => 7
        )

    [4] => Array
        (
            [parent] => Known me
            [parentId] => 5
            [child] => Best life moment
            [childId] => 8
        )
)

И я хочу отфильтровать этот массив так, чтобы их фильтрация основывалась на родительском индексе, а конечный результат был бы такой:

Array
(
    [0] => Array
        (
            [parent] => Basic
            [parentId] => 1
            [child] => Array
                (
                    [0] => Birthday
                    [1] => Gender
                )

        )

    [1] => Array
        (
            [parent] => Geo
            [parentId] => 10
            [child] => Array
                (
                    [0] => Current City                  
                )

        )

    [2] => Array
        (
            [parent] => Known me
            [parentId] => 5
            [child] => Array
                (
                    [0] => My personality
                    [1] => Best life moment
                )

        )
)

Для этого я кодировал:

$filter = array();
$f = 0;
for ($i=0; $i<count($menuArray); $i++) {
    $c = 0;
    for( $b = 0; $b < count($filter); $b++ ){

        if( $filter[$b]['parent'] == $menuArray[$i]['parent'] ){
            $c++;
        }
    }
    if ($c == 0) {
        $filter[$f]['parent'] = $menuArray[$i]['parent'];
        $filter[$f]['parentId'] = $menuArray[$i]['parentId'];
        $filter[$f]['child'][] = $menuArray[$i]['child'];
        $f++;
    } 
}

Но это приводит:

Array
(
    [0] => Array
        (
            [parent] => Basic
            [parentId] => 1
            [child] => Array
                (
                    [0] => Birthday
                )

        )

    [1] => Array
        (
            [parent] => Geo
            [parentId] => 10
            [child] => Array
                (
                    [0] => Current City
                )

        )

    [2] => Array
        (
            [parent] => Known me
            [parentId] => 5
            [child] => Array
                (
                    [0] => My personality
                )

        )
)

Может ли кто-нибудь указать на мой пропавший LOC?

Ответы [ 2 ]

1 голос
/ 01 июня 2010

Попробуйте:

$filter = array();
foreach ($menuArray as $menu) {
  if (!array_key_exists($menu['parent_id'], $filter)) {
    $filter[$menu['parent_id']] = array(
      'parent' => $menu['parent'],
      'parent_id' => $menu['parent_id'],
      'child' => array()
    );
  }
  $filter[$menu['parent_id']]['child'][$menu['child_id']] = $menu['child'];
}

Это создаст массив как:

Array
(
    [1] => Array
        (
            [parent] => Basic
            [parentId] => 1
            [child] => Array
                (
                    [2] => Birthday
                    [3] => Gender
                )

        )

    [10] => Array
        (
            [parent] => Geo
            [parentId] => 10
            [child] => Array
                (
                    [11] => Current City                  
                )

        )

    [5] => Array
        (
            [parent] => Known me
            [parentId] => 5
            [child] => Array
                (
                    [7] => My personality
                    [8] => Best life moment
                )

        )
)

Обратите внимание, что индексы массива соответствуют идентификаторам. Вы не можете сделать это с помощью цикла for, но вы можете foreach ($filter as $parent_id=>$parent) правильно. Если вы хотите, вы можете изменить строку 4 моего кода на $filter['key_' . $menu['parent_id']], чтобы форсировать строку, и цикл for будет работать

0 голосов
/ 01 июня 2010

Следующий фрагмент кода полностью не проверен и основан на идее, что он отсортирован по parentId.

$filter = array();
$option = null;
for( $i = 0; $i < count( $menuArray ); $i++ ) {
    if( count( $filter ) < 1 || $filter[count($filter)-1]['parentId'] != $menuArray['parentId'] ) {
        if( $option != null ) {
            $filter[]   = $option;
        }

        $option = array(
            "parent"    => $menuArray[$i]['parent'],
            "parentId"  => $menuArray[$i]['parentId'],
            "child"     => array()
        );
    }

    $option['child'][]  = $menuArray[$i]['child'];
}

$filter[]   = $option; // one last time, because we left the loop already.
unset( $option ); // we don't need it anymore.

Что он делает, он создает $option для каждого родителя. Как только мы нажимаем следующую parentId, мы добавляем текущий $option в массив $filter и создаем новый объект $option.

Все дети просто продолжают добавляться к текущему $option.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...