Сгладить многомерный массив PHP - PullRequest
0 голосов
/ 25 сентября 2018

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

Array
(
[0] => Array
    (
        [case_code_id] => 1
        [parent_id] => 0
        [case_code] => Main A
        [sub_codes] => Array
            (
                [0] => Array
                    (
                        [case_code_id] => 3
                        [parent_id] => 1
                        [case_code] => Sub A
                        [sub_codes] => Array
                            (
                                [0] => Array
                                    (
                                        [case_code_id] => 5
                                        [parent_id] => 3
                                        [case_code] => Sub Sub A
                                        [sub_codes] => Array
                                            (
                                            )

                                    )

                            )

                    )

                [1] => Array
                    (
                        [case_code_id] => 4
                        [parent_id] => 1
                        [case_code] => Sub B
                        [sub_codes] => Array
                            (
                            )

                    )

            )

    )

[1] => Array
    (
        [case_code_id] => 2
        [parent_id] => 0
        [case_code] => Main B
        [sub_codes] => Array
            (
            )

    )

)

Но я хотел бы преобразовать это в следующее:

Array
(
    [0] => Array
    (
        [case_code_id] => 1
        [parent_id] => 0
        [case_code] => Main A
    )
    [1] => Array 
    (
        [case_code_id] => 3
        [parent_id] => 1
        [case_code] => Sub A
    )
    [2] => Array
    (
        [case_code_id] => 5
        [parent_id] => 3
        [case_code] => Sub Sub A
    )
    [3] => Array
    (
        [case_code_id] => 4
        [parent_id] => 1
        [case_code] => Sub B
    )
    [4] => Array
    (
        [case_code_id] => 2
        [parent_id] => 0
        [case_code] => Main B
        [sub_codes] => Array
    )

Я пробовал несколько циклов, но ничего не возвращает полный массив.

Вот что у меня есть для моего цикла:

public function array_flatten($array,$list=array()){
    for ($i=0;$i<count($array);$i++) {
        $results[] = array(
            'case_code_id'=>$array[$i]['case_code_id'],
            'case_code'=>$array[$i]['case_code'],
            'parent_id'=>$array[$i]['parent_id']
        );
        if (count($array[$i]['sub_codes']) > 0) {
            $this->array_flatten($array[$i]['sub_codes'],$results);
        } else {
            $results[] = $array[$i];
        }
    }
    return $results;
}

И я называю это так: ($ multi содержит многомерный массив)

  $flat = $this->array_flatten($multi); 

Переменная $ multi создается из этой функции:

public function build_case_code_tree(array $elements, $parentId = 0) {
    $branch = array();
    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = $this->build_case_code_tree($elements, $element['case_code_id']);
            $element['sub_codes'] = $children;
            $branch[] = $element;
        }
    }
    return $branch;
}

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018
function array_flatten($a, $flat = []) {
    $entry = [];
    foreach ($a as $key => $el) {
        if (is_array($el)) {
            $flat = array_flatten($el, $flat);
        } else {
            $entry[$key] = $el;
        }
    }
    if (!empty($entry)) {
        $flat[] = $entry;
    }
    return $flat;
}
print_r(array_flatten($multi));
0 голосов
/ 25 сентября 2018

Вы не используете $list в коде, и ничего не передается по ссылке.Вы близки, но ваша функция должна использовать $list вместо $results, и она должна получить $list по ссылке и изменить ее вместо того, чтобы возвращать.

Что-то вроде этого (хотя и не проверено):

function array_flatten($array,&$list=array()){
    for ($i=0;$i<count($array);$i++) {
        $list[] = array(
            'case_code_id'=>$array[$i]['case_code_id'],
            'case_code'=>$array[$i]['case_code'],
            'parent_id'=>$array[$i]['parent_id']
        );
        if (count($array[$i]['sub_codes']) > 0) {
            $this->array_flatten($array[$i]['sub_codes'],$list);
        } else {
            $list[] = $array[$i];
        }
    }
}

И назвать это так:

$flat = Array();
$this->array_flatten($multi, $flat);
// Result is inside $flat now
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...