[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Слить два многомерных массива не нарушая порядок.
linf
Пытаюсь слить два многомерных массива, тоесть дописать второй в конец первого, необходимо:
1. Что бы последовательность каждого не нарушалась (ибо отсортированы уже как надо).
2. Если в первом массиве есть сходное значение в поле [link] то этот элемент дописывать не надо. (и переписывать не надо!!! тоесть значения первого массива важнее!!!)

Массив 1:

PHP
Array
(
    [0] => Array
        
(
            [count] => 5
            
[text] => текст 1
            
[link] => www.link1.ru
        
)

    [1] => Array
        
(
            [count] => 2
            
[text] => текст 2
            
[link] =>  www.link2.ru
        
)

    [2] => Array
        
(
            [count] => 1
            
[text] => текст 3
            
[link] => www.link3.ru
        
)
)


Массив 2:
PHP
Array
(
    [0] => Array
        
(
            [count] => 8
            
[text] => текст 4
            
[link] => www.link4.ru
        
)

    [1] => Array
        
(
            [count] => 3
            
[text] => текст 5
            
[link] =>  www.link1.ru
        
)

    [2] => Array
        
(
            [count] => 1
            
[text] => текст 6
            
[link] => www.link5.ru
        
)
)

Исходя из примера, нужно в первый массив дописать только [0] и [2] элементы второго, а элемент [1] второго не надо, так как его [link] уже имеется в 1 массиве.


Функция $out_all = array_merge ($out1, $out1); делает все как надо, только не удаляет одинаковые значения.
Если выносить [link] на уровень выше, то заменяются значения в других ячейках, а этого нельзя допустить!

Наверное можно как то сделать циклом, но я чего то запутался, да и будет ли это работать быстро?



Спустя 34 минуты, 29 секунд (6.10.2009 - 19:28) kirik написал(а):
Цитата (linf @ 6.10.2009 - 10:53)
Наверное можно как то сделать циклом, но я чего то запутался, да и будет ли это работать быстро?

Угу, угу..

Первый массив не трогаешь, в него всего лишь будешь дописывать, второй массив проводишь через цикл, где наличие каждого проверяешь на наличие в первом массиве (например этой функцией). Если значение присутствует в первом массиве, continue; если нет - дописываешь в первый массив.

Либо, чтобы каждый раз не сканить первый массив, проходишь его циклом и вытаскиваешь все значения link в отдельный массив, который потом чекаешь (функцией in_array()). Это будет быстрее и менее ресурсозатратно, чем каждый раз рекурсивно искать значение в первом массиве.

Спустя 13 часов, 48 минут, 3 секунды (7.10.2009 - 09:16) linf написал(а):
Сделал вот так...

PHP
for ($z=0; $z < count($out2); $z++)    {
    $num = 0;
    $co1 = count($out1);
    for ($t=0; $t < count($out1); $t++)    {
        if (in_array($out2[$z][link], $out1[$t])) {$num += 1;}
                        }
    
if ($num < 1) {
           
$out1[$co1][count] = $out2[$z][count]; 
           $out1
[$co1][text] = $out2[$z][text]; 
           $out1
[$co1][link] = $out2[$z][link];
                          }
                    }


Хочу заметить, что скорость выполнения такая же как и в случае применения $out_all = array_merge ($out1, $out2); и составляет 0.022425 сек (на моем компьютере, при длине каждого массива до 1000). Думаю на сервере будет и того быстрее.

Спустя 30 минут, 30 секунд (7.10.2009 - 09:47) glock18 написал(а):
22 мс на парсинг массива? smile.gif это ооочень много. и на сервере вряд ли будет быстрее хотя бы потому, что на сервер будет заходить (предположительно) много народу.

Спустя 9 часов, 29 минут, 20 секунд (7.10.2009 - 19:16) kirik написал(а):
Цитата (linf @ 7.10.2009 - 01:16)
составляет 0.022425 сек (на моем компьютере, при длине каждого массива до 1000). Думаю на сервере будет и того быстрее.

Хоть и 2 сотых секунды и не так много ( glock18 поправлю smile.gif ), но не стоит надеяться что "на сервере будет быстрее", когда есть куда оптимизировать код. Попробуй второй вариант, который я предложил - вынести значения link из исходного массива в отдельный массив.
А у тебя 2 тонких места - цикл в цикле и count() в for'е стоит не там.

Попробуй код
PHP
$array1 = array( /*...*/ ); // исходный массив №1 (который будем дополнять)
$array2 = array( /*...*/ ); // исходный массив №2 (из которого будем дополнять)

$tmp_arr = array();

// записываем все линки первого массива в отдельный массива
// в котором потом будем их искать
for($i 0$c count($array1); $i $c$i++)
{
    
$tmp_arr[] = $array1[$i]['link'];
}

// дополняем первый массив несуществующими значениями из второго
for($i 0$c count($array2); $i $c$i++)
{
    if(!
in_array($array2[$i]['link'], $tmp_arr))
    {
        
$array1[] = $array2[$i];
    }
}
unset(
$array2);

print_r($array1);


Спустя 22 часа, 25 минут, 40 секунд (8.10.2009 - 17:42) linf написал(а):
не, во первых я вынес link в ключи,
во вторых, у меня не два массива а один, дописываемый на разных стадиях заполнения, если такого еще нет в массиве: array_key_exists($content[0], $out1) === false

теперь при тех же условиях скорость составляет в 2 раза меньше... smile.gif

теперь есть еще одни задачка, помогите разобраться:
http://phpforum.ru/index.php?act=ST&f=19&t=21576


_____________
Live in new format =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.