|
|
|
| Прошу помощи.
Возникла необходимость объединить или добавить идентификатор полученный из одного массива в другой массив.
Список в переменной $ident имеет идентификатор и название канала но нет названия раздела .
Массив 1:
8619 ; Hits
1618 ; Sport Klub 1
6460 ; Sport Klub 2
6307 ; Sale
В первой части строки идентификатор, во второй название станции.
Массив 2:
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits (Музыка)
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх2 ; Sport Klub 1 (Спорт)
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх3 ; Sport Klub 2 (Спорт)
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх4 ; Sale (Развлекательные)
После разбора получаю в переменной $s.
Поставил условный разделитель " ; " данных.
Задача привести строку виду
8619 ; stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits (Музыка)
1618 ; stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх2 ; Sport Klub 1 (Спорт)
6460 ; stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх3 ; Sport Klub 2 (Спорт)
6307 ; stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх4 ; Sale (Развлекательные)
Названия могут иметь разную сортировку и некоторые названия станций могут отсутствовать.
Пробовал и сортировкой и через записывать файлы, чтобы вносить раздельно в БД. Но к сожалению приемлемого решения не нашел.
Заранее спасибо за помощь. | |
|
|
|
|
|
|
|
для: Yuryus
(04.01.2015 в 14:25)
| | Так много сказано, а нужного нет.
После разбора получаю в переменной $s.
Поставил условный разделитель " ; " данных.
Массив 2: - это что каждый элемент его так выглядит:
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits (Музыка) ?
А вот это
8619 ; Hits
1618 ; Sport Klub 1
6460 ; Sport Klub 2
6307 ; Sale
не можете преобразовать в массив? | |
|
|
|
|
|
|
|
для: confirm
(04.01.2015 в 15:02)
| | Спасибо за помощь.
Простите только начинаю изучать php.
Массив 1:
Это строки в массиве. Т.е. в массиве при выводе такое содержание.
8619 ; Hits
1618 ; Sport Klub 1
6460 ; Sport Klub 2
6307 ; Sale
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits (Музыка) ?
Да. меняется содержание, но в общем в переменной тоже список с такими значениями.
Данные которые совпадают, это только название и то не полностью. В первом варианте Hits во втором Hits (Музыка).
Задача привести строку виду
8619 ; stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits (Музыка)
Или так
8619 ; stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits
Мы с Вами общались в другой теме, если не ошибаюсь
http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=91503&page=1
Вашим же скриптом получаю два списка. но теперь задача их объединить.
Спасибо. | |
|
|
|
|
|
|
|
для: Yuryus
(04.01.2015 в 19:25)
| | Тогда речь идет не об объединении, а о комбинировании массивов, и для этого есть функции РНР array_combine(). Условие одно - одинаковое количество элементов обеих массивов.
Здесь примеры и описание. | |
|
|
|
|
|
|
|
для: confirm
(04.01.2015 в 20:42)
| | Спасибо.
Пытался сделать по ссылке выше чуть раньше и живого примера к сожалению не сохранил.
Но проблема в том что количество строк не одинаково (поэтому вероятно получал ошибку).
Есть еще какие возможности реализации?
Возможно сделать сортировку и построчно обработать до первой ошибки?
Спасибо. | |
|
|
|
|
|
|
|
для: Yuryus
(05.01.2015 в 02:25)
| | Не важно как реализовать, функцией ли стандартной, обходом в цикле и самостоятельно создавая массив, количество элементов в массивах комбинируемых должно быть одинаково.
А это означает, что перед объединением нужно взять равные части элементов, если количество может быть различным. Нужно только определиться - количество какого из этих двух массивов является критерием этого. Если первого, который будет определять в итоговом массиве ключи его, то:
а) количество второго массива >= количеству первого - комбинируем, взяв со второго массива срез (array_slice) равный размеру первого
б) количество второго массива < количеству первого - в этом случае, по идее комбинировать не стоит, хотя можно поступить точно также как и в случае а). Но нужна какая-то гарантия того, что итоговый массив отражает именно то, что требовалось - каждый его ключ, это искомые для него значения. | |
|
|
|
|
|
|
|
для: confirm
(05.01.2015 в 12:29)
| | Прошу прощения за навязчивость, можно попросить выразить в коде. Чтобы по крайней мере было от чего отталкиваться. Не совсем могу понять как это можно лаконично сделать используя инструментарий.
Спасибо. | |
|
|
|
|
|
|
|
для: Yuryus
(05.01.2015 в 14:33)
| | Сам код простой, я не буду сейчас его конкретно к вашим "строкам" привязывать, некогда сейчас вникать в их условия всякие, да и не в них суть, просто поясню на примере, а свои строки сами опишите.
<?
//есть два исходных массива, первый из которых будет служить ключами, а второй значениями
//очень ВАЖНО при этом, что мы точно знаем, что каждый индекс первого массива,
//имеет соответствие во втором массиве, находящемся под этим же индексом
$a = array('key 1', 'key 2', 'key 3', 'key 4'); //будут ключами после комбинирования
$b = array('var 1', 'var 2', 'var 3', 'var 4', 'var 5', 'var 6'); //будут значениями после комбинирования
//второй массив имеет большее количество, чем первый, но значения каждого под "правильными" для нас индексами
//первый массив - это приоритетный массив, ОН определяет массив результирующий, поэтому:
if(sizeof($b) >= sizeof($a)) { //количество элементов массива значений не менее массива ключей, комбинируем
$m = array_combine($a, array_splice($b, 0, sizeof($a)));
} else { //количество элементов массива значений меньше количества элементов ключей
//как поступить:
//зная, что индексы каждого массива следуют строго по порядку, и "пусто" только в конце
//получаем уже ключ как срез из массива ключей по размеру массива значений
$m = array_combine(array_splice($a, 0, sizeof($b)), $b);
}
//результат
print_r($m);
//но это, если нет "пусто" в середине какого либо из массивов
//для того чтобы сказать - "надо действовать так", нужно знать все else, которые могут возникать при получении массивов из строк
//предположим, что элементы массива ключей будут присутствовать всегда
//а вот строка описывающая этот ключ нет, то есть в массиве элементов могут быть пустоты,
//и не обязательно по порядку и только в конце, а по любому смещению
//в этом случае приоритетным является массив значений, он будет определять массив результирующий
//пусть в результате мы получили вот такие массивы
$a = array('key 1', 'key 2', 'key 3', 'key 4', 'key 5', 'key 6'); //будут ключами после комбинирования
$b = array('var 1', '', 'var 3', ' ', 'var 5', ''); //будут значениями после комбинирования
//количество элементов у обоих одинаково, но есть пустоты в массиве значений
//удалим пустые элементы из массива значений
$b = array_diff(array_map('trim', $b), array(''));
//очищенный массив сохранит индексы своих элементов
print_r($b);
//а значит, зная, что массив ключей не может иметь пустот,
//просто выбираем из него ключи для очищенного массива значений
//делается это пересечением массива по ключу
//и сразу комбинируем
$m = array_combine(array_intersect_key($a, $b), $b);
//результат
print_r($m);
//если и в массиве ключей тоже могут быть пустоты
//то его надо тоже очистить от пустых элементов
//а далее как выше - пересечение массивов
$a = array('key 1', 'key 2', ' ', 'key 4', '', 'key 6'); //будут ключами после комбинирования
$b = array('var 1', '', 'var 3', ' ', 'var 5', ''); //будут значениями после комбинирования
//удаляем пустоты
$a = array_diff(array_map('trim', $a), array(''));
$b = array_diff(array_map('trim', $b), array(''));
//что получаем
print_r($a);
print_r($b);
//пересечение даст нам следующие
print_r(array_intersect_key($a, $b));
//поэтому итоговый будет
$a = array_intersect_key($a, $b);
$m = array_combine($a, array_intersect_key($b, $a));
//результат
print_r($m);
|
| |
|
|
|
|
|
|
|
для: Yuryus
(05.01.2015 в 14:33)
| | главная ваша проблема в том, что первый и второй массивы не имеют ключевых идентификаторов - данных, которые бы позволили однозначно сопоставить строки одного из массивов строкам другого.
И пока вы не определитесь с ключами, никакой код вам не поможет. только запутает. | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2015 в 16:49)
| | Как вариант привести к единым ключам
$s = str_replace('(Музыка)', ' ', $s);
$s = str_replace('(Спорт)', '', $s);
$s = str_replace('(Развлекательные)', '', $s);
и т.д. Это уже использовал.
В массиве 2 ключи будут совпадать
И возможно рассматривать вариант массивов.
Массив 1:
8619 ; Hits
1618 ; Sport Klub 1
6460 ; Sport Klub 2
6307 ; Sale
В первой части строки идентификатор, во второй название станции.
Массив 2:
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх2 ; Sport Klub 1
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх3 ; Sport Klub 2
stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх4 ; Sale | |
|
|
|
|
|
|
|
для: Yuryus
(05.01.2015 в 18:08)
| | напишите, пожалуйста, этот пример в виде кода списков исходных данных.
$x1 = array(
....
....
....
....
....
);
$x2 = array(
....
....
....
....
....
);
|
| |
|
|
|
|
|
|
|
для: Trianon
(05.01.2015 в 19:48)
| | $x1 = array(
$k[1],
$k[3]
);
$x2 = array(
$v[0],
$v[1]
);
Значения переменных
$k[1] = [1] => 12432
$k[3] = [3] => Hits
$v[0] = [0] => Hits (Музыка)
$v[1] = [1] => stream://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx1
Спасибо. | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2015 в 19:48)
| | Насколько большими данными можно оперировать в массиве?
База на файлах изначально и считывается в 2 массива около 500 строк.
Спасибо. | |
|
|
|
|
|
|
|
для: Yuryus
(06.01.2015 в 12:24)
| | ограничения выставляются на общий объем памяти, потребляемый скриптом.
Параметр memory_limit в php.ini
на размер массива отдельных ограничений нет. | |
|
|
|
|
|
|
|
для: Trianon
(06.01.2015 в 12:52)
| | Спасибо. | |
|
|
|
|