Сложность алгоритма уменьшения многомерного массива на 1 - PullRequest
1 голос
/ 24 февраля 2020

Пример массива (может отличаться по количеству уровней или членов.

$dataset_groups = array(
    'first_level1_group' => array(
        array(
            'fname' => 'John', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pear'), 
        ), 
    ),
    'second_level1_group' => array(
        array(
            'fname' => 'Adam', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pear'), 
        ),
        array(
            'fname' => 'Jane', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pineapple'), 
        ), 
    ),
    'third_level1_group' => array(
        array(
            'fname' => 'Andrew', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pear'), 
        ),
        array(
            'fname' => 'Ross', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pineapple'), 
        ), 
    ),
);

Я хочу сделать что-то похожее на (избавиться от first_level1, et c)

$dataset_groups = array(
    array(
        'fname' => 'John', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pear'), 
    ), 
    array(
        'fname' => 'Adam', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pear'), 
    ),
    array(
        'fname' => 'Jane', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pineapple'), 
    ), 
    array(
        'fname' => 'Andrew', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pear'), 
    ),
    array(
        'fname' => 'Ross', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pineapple'), 
    ), 
);

Вопрос в том, будет ли что-то подобное

foreach ($dataset_groups as $group_key => $group) {

    if (empty($dataset)) {

        $dataset = $group;

    } else {

        $dataset = array_merge($dataset, $group);

    }

}

более эффективным (я думаю, что это должно быть О (n) сложностью) или этим (как я обнаружил в одном из предложения)? $dataset = call_user_func_array('array_merge', $dataset_groups);

Так как я не знаю внутреннюю работу call_user_func_array(), мне трудно определить (хотя у меня есть ощущение, что это будет почти то же самое).

РЕДАКТИРОВАТЬ1: в основном мне интересно, есть ли причина для перехода на call_user_func_array() помимо читабельности.

1 Ответ

0 голосов
/ 08 марта 2020

Вы также можете использовать array_reduce () с анонимной функцией вместо foreach l oop.

$newArray = array_reduce($dataset_groups, 
  function($carry, $item){
    return array_merge($carry,$item);
  }, []
);
...