Динамически создайте массив массивов со строковым ключом/индексом в PHP

#php #arrays

Вопрос:

Хорошо, это кажется довольно простым, и я искал другой ответ, но, возможно, я ищу не то, что нужно. У меня есть список URL-адресов и страниц, содержащих эти URL-адреса

 https://example.com/?p=1 | https://example.com/go/test404/
https://example.com/?p=1 | https://example.com/404
https://example.com/?p=5 | https://example.com/go/test404/
https://example.com/?p=5 | https://example.com
 

Я перебираю каждую строку и разбираю URL-адреса на $parent (первый столбец) и $destination (второй столбец).

Теперь я хочу закончить следующим, но не могу понять, как создать эту структуру с внешним массивом под названием $allLinks:

 Array
(
    [https://example.com/go/test404/] => Array
        (
            [0] => https://example.com/?p=1
            [1] => https://example.com/?p=5
        )

    [https://example.com/404] => Array
        (
            [0] => https://example.com/?p=1
        )

    [https://example.com] => Array
        (
            [0] => https://example.com/?p=5
        )
)
 

Большое вам спасибо за помощь в этом.

В цикле я пытался $allLinks[$destination] .= [$parent] , array_push($allLinks[$destination], $parent) но ни то, ни другое, похоже, не работает на меня.

Комментарии:

1. array_push должен работать и может быть (лучше) написан $allLinks[$destination][]=$parent;

2. Да, это одна из причин [] , по которой обычно предпочитают array_push .

3. Итак, обозначение, которое вы мне дали, сработало: $allLinks[$destination][]=$parent; Однако, когда я использовал array_push следующим образом, я получал исключение при первой вставке (чего я не получаю с вашей нотацией). Исключением было то, что array_push() ожидает, что параметр 1 будет массивом с заданным значением null (как и ожидалось, поскольку в массиве «значение» еще нет значений). $allLinks[$destination] = array_push($allLinks[$destination], $parent); Почему/в чем разница в обозначениях?

Ответ №1:

Вы можете делать это во время чтения/разделения частей. Я не знаю, как вы это делаете, но ниже предполагается, что вы прочитали строки из файла в массив. Просто используйте родителя в качестве ключа и добавьте [] каждое место назначения в массив:

 foreach($file as $line) {
    list($parent, $destination) = explode(' | ', $line);
    $result[$parent][] = $destination;
}
 

Вот как бы я это сделал, но, перечитывая, кажется, что вы хотите противоположного:

 foreach($file as $line) {
    list($parent, $destination) = explode(' | ', $line);
    $result[$destination][] = $parent;
}
 

array_push требуется массив в качестве первого аргумента, поэтому для его использования (не рекомендуется) вам придется проверить, установлен ли он, а если нет, то сначала определите его как массив. Что-то вроде:

 $result[$destination] = $result[$destination] ?? [];
array_push($result[$destination], $parent);
 

Верхняя строка переводится в:

 if(!isset($result[$destination])) {
    $result[$destination] = [];
}
 

Комментарии:

1. Да, это в основном та же нотация, которую предложил @Dri372, с $result[$destination][] = $parent; Я действительно не понимаю, почему это отличается от использования $result[$destination] = array_push($result[$destination], $parent); но я не знаю, что меня так сильно волнует, ЛОЛ. Спасибо вам и Dri372 за быстрый ответ!

2. Отредактировано с примером array_push .