Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите объединить два массива
 
 автор: Yuryus   (04.01.2015 в 14:25)   письмо автору
 
 

Прошу помощи.
Возникла необходимость объединить или добавить идентификатор полученный из одного массива в другой массив.

Список в переменной $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 (Развлекательные)

Названия могут иметь разную сортировку и некоторые названия станций могут отсутствовать.
Пробовал и сортировкой и через записывать файлы, чтобы вносить раздельно в БД. Но к сожалению приемлемого решения не нашел.

Заранее спасибо за помощь.

  Ответить  
 
 автор: confirm   (04.01.2015 в 15:02)   письмо автору
 
   для: Yuryus   (04.01.2015 в 14:25)
 

Так много сказано, а нужного нет.

После разбора получаю в переменной $s.
Поставил условный разделитель " ; " данных.


Массив 2: - это что каждый элемент его так выглядит:

stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1 ; Hits (Музыка) ?

А вот это

8619 ; Hits
1618 ; Sport Klub 1
6460 ; Sport Klub 2
6307 ; Sale

не можете преобразовать в массив?

  Ответить  
 
 автор: Yuryus   (04.01.2015 в 19:25)   письмо автору
 
   для: 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

Вашим же скриптом получаю два списка. но теперь задача их объединить.
Спасибо.

  Ответить  
 
 автор: confirm   (04.01.2015 в 20:42)   письмо автору
 
   для: Yuryus   (04.01.2015 в 19:25)
 

Тогда речь идет не об объединении, а о комбинировании массивов, и для этого есть функции РНР array_combine(). Условие одно - одинаковое количество элементов обеих массивов.

Здесь примеры и описание.

  Ответить  
 
 автор: Yuryus   (05.01.2015 в 02:25)   письмо автору
 
   для: confirm   (04.01.2015 в 20:42)
 

Спасибо.
Пытался сделать по ссылке выше чуть раньше и живого примера к сожалению не сохранил.
Но проблема в том что количество строк не одинаково (поэтому вероятно получал ошибку).
Есть еще какие возможности реализации?
Возможно сделать сортировку и построчно обработать до первой ошибки?
Спасибо.

  Ответить  
 
 автор: confirm   (05.01.2015 в 12:29)   письмо автору
 
   для: Yuryus   (05.01.2015 в 02:25)
 

Не важно как реализовать, функцией ли стандартной, обходом в цикле и самостоятельно создавая массив, количество элементов в массивах комбинируемых должно быть одинаково.
А это означает, что перед объединением нужно взять равные части элементов, если количество может быть различным. Нужно только определиться - количество какого из этих двух массивов является критерием этого. Если первого, который будет определять в итоговом массиве ключи его, то:

а) количество второго массива >= количеству первого - комбинируем, взяв со второго массива срез (array_slice) равный размеру первого

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

  Ответить  
 
 автор: Yuryus   (05.01.2015 в 14:33)   письмо автору
 
   для: confirm   (05.01.2015 в 12:29)
 

Прошу прощения за навязчивость, можно попросить выразить в коде. Чтобы по крайней мере было от чего отталкиваться. Не совсем могу понять как это можно лаконично сделать используя инструментарий.
Спасибо.

  Ответить  
 
 автор: confirm   (05.01.2015 в 16:24)   письмо автору
 
   для: 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($aarray_splice($b0sizeof($a)));
} else { 
//количество элементов массива значений меньше количества элементов ключей 
    //как поступить:
    //зная, что индексы каждого массива следуют строго по порядку, и "пусто" только в конце
    //получаем уже ключ как срез из массива ключей по размеру массива значений
    
$m array_combine(array_splice($a0sizeof($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($aarray_intersect_key($b$a));

//результат
print_r($m);  

  Ответить  
 
 автор: Trianon   (05.01.2015 в 16:49)   письмо автору
 
   для: Yuryus   (05.01.2015 в 14:33)
 

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

  Ответить  
 
 автор: Yuryus   (05.01.2015 в 18:08)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (05.01.2015 в 19:48)   письмо автору
 
   для: Yuryus   (05.01.2015 в 18:08)
 

напишите, пожалуйста, этот пример в виде кода списков исходных данных.


 $x1  = array(
....
....
....
....
....
);

 $x2  = array(
....
....
....
....
....
);

  Ответить  
 
 автор: Yuryus   (05.01.2015 в 20:41)   письмо автору
 
   для: 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

Спасибо.

  Ответить  
 
 автор: Yuryus   (06.01.2015 в 12:24)   письмо автору
 
   для: Trianon   (05.01.2015 в 19:48)
 

Насколько большими данными можно оперировать в массиве?
База на файлах изначально и считывается в 2 массива около 500 строк.
Спасибо.

  Ответить  
 
 автор: Trianon   (06.01.2015 в 12:52)   письмо автору
 
   для: Yuryus   (06.01.2015 в 12:24)
 

ограничения выставляются на общий объем памяти, потребляемый скриптом.
Параметр memory_limit в php.ini
на размер массива отдельных ограничений нет.

  Ответить  
 
 автор: Yuryus   (06.01.2015 в 14:01)   письмо автору
 
   для: Trianon   (06.01.2015 в 12:52)
 

Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования