В поисках способа построения многомерного, многослойного, ассоциативного массива - PullRequest
0 голосов
/ 06 марта 2020

Так что у меня возникают проблемы, когда я перебираю строку и вставляю ее символы в виде индексных массивов в многомерный ассоциативный массив. Так что в основном это куча многомерных массивов в многомерных массивах в многомерных массивах ... Это немного хлопотно, так как я не могу сделать это вручную. Мне нужен автоматизированный способ сделать это с кучей строк. Следующий пример объяснит это немного лучше, я думаю:

//string i want to enter
$string = 'ADAM';
//array i want to end up with
$result = array
              (
                'A'=> array
                 (
                  'D'=>array
                   (
                    'A'=>array
                     (
                      'M'=>array
                        (
                          'result'=>'ADAM'
                        )
                     )
                   )
                 )
               )

Мой первоначальный подход заключался в использовании условий if для вставки первого Char как Array в основной массив, например:

for($i = 0; $i < strlen($string); $i++){
      if($i == 0){
       $array1[$word[$i]] = array();
      }
}

, который работает довольно хорошо. Но потом я столкнулся с проблемой: как отслеживать текущую точку в массиве? После проверки if я буду go для оператора else, который действует, когда $ i больше 0. Но если я хочу вставить следующее измерение массива, которое в этом случае будет 'D', мне понадобится чтобы выбрать $ array1 ['A'], для следующего мне понадобится $ array1 ['A'] ['D'] et c. Я не смог найти способ сделать это. Строки, которые мне нужны, чтобы попасть в этот массив, варьируются от 4 до 70 символов. Каждый известный мне метод изменял только 2-е измерение, поэтому я получил:

$array1('A'=>array ('A' =>array()));
$array1('A'=>array ('D' =>array()));
$array1('A'=>array ('A' =>array()));
$array1('A'=>array ('M' =>array()));

или недопустимые ошибки смещения, вызванные тем, что индексы сами являются массивами. Возможно, мой подход здесь невозможен, но я все же подумал, что могу спросить, если что-то пропустил.

На более позднем этапе я собираюсь использовать один и тот же массив для всех строк, поэтому я в основном использую символы в качестве узлов. Если «A» в качестве первого символа уже существует, я бы пропустил его и вставил 2-й символ следующей строки в «A'-Array et c.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 06 марта 2020

Для этого вы можете использовать рекурсивную функцию.

function nest(string $str, int $i = 0) {
    return isset($str[$i]) ? [$str[$i] => nest($str, $i + 1)] : ['result' => $str];
}

$result = nest($string);
1 голос
/ 06 марта 2020

вот решение для того, чего вы пытаетесь достичь. См. Рабочее решение здесь с комментариями, объясняющими, что оно работает.

$val = 'ADAM';
$arr = [];
$keys = str_split($val);
$curr = &$arr;
foreach($keys as $key) {
    $curr = &$curr[$key];
}
$curr = ['result' => $val];

print_r($arr);
1 голос
/ 06 марта 2020

Вы можете использовать ссылки, чтобы при вводе строки go вы добавляли следующий символ в качестве ключа к массиву, а затем устанавливали эту новую запись в качестве точки добавления для следующей операции в l oop. ..

$string = 'ADAM';
$result = [];
$add = &$result;
for($i = 0; $i < strlen($string); $i++){
    $add = &$add[$string[$i]];
}
$add['result'] = $string;
print_r($result);

Просто чтобы показать, как будет работать добавление нескольких записей ...

addEntry ( $result, "ADAM");
addEntry ( $result, "ALAN");
addEntry ( $result, "ADAME");

function addEntry ( &$result, string $newValue )  {
    for($i = 0; $i < strlen($newValue); $i++){
        $result = &$result[$newValue[$i]];
    }
    $result['result'] = $newValue;
}

приводит к ...

Array
(
    [A] => Array
        (
            [D] => Array
                (
                    [A] => Array
                        (
                            [M] => Array
                                (
                                    [result] => ADAM
                                    [E] => Array
                                        (
                                            [result] => ADAME
                                        )

                                )

                        )

                )

            [L] => Array
                (
                    [A] => Array
                        (
                            [N] => Array
                                (
                                    [result] => ALAN
                                )

                        )

                )

        )

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