#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
.