[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удалить одинаковые значения массива, по ключу.
linf
Как можно удалить одинаковые значения многомерного массива, сравнивая только по определенному ключу?

пример:

PHP
Array
(
    [
0] => Array
        (
            [
count] => 1
            
[link] => снег
        
)

    [
1] => Array
        (
            [
count] => 2
            
[link] => снег
        
)

    [
2] => Array
        (
            [
count] => 6
            
[link] => лед
        
)
)


а должно стать так:

PHP
Array
(

    [
1] => Array
        (
            [
count] => 2
            
[link] => снег
        
)

    [
2] => Array
        (
            [
count] => 6
            
[link] => лед
        
)
)


доп. условия:
можно что бы ключ верхнего уровня не сохранялся... [0][1][2] -> [0][1]
хотелось бы что бы оставалась та группа, в которой остальные значения (в частности [count]) больше.



Спустя 19 минут (5.10.2009 - 17:50) sergeiss написал(а):
Я бы сделал задачу так:
Просто иду по циклу по всем элементам массива, и сравниваю текущий элемент со всеми остальными. Если у них совпадает элемент link, то тогда оставляю тот элемент, у которого больше count. А другой тупо удаляю через unset.
Можно предварительно отсортировать основной массив функцией usort(). Надо только будет правильно написать функцию обратного вызова. А затем опять же идем циклом по массиву, и проводим подобные сравнения. Только, в отличие от первого варианта, сравнений будет меньше, потому что массив будет уже упорядочен.

Спустя 15 минут, 3 секунды (5.10.2009 - 18:05) kirik написал(а):
Я бы решил задачку так:
Проходим циклом через весь исходный массив, создавая новый ассоциативный двумерный массив вида:
PHP
Array
(
    [
link] => Array
        (
            [
count] => int
            
[link] => str
        
)
)

При записи нового элемента мы проверяем, существует-ли в набираемом массиве элемент с ключем link, если да, то проверяем значение count; если оно больше, то переписываем значение. Потом просто делаем этому массиву array_values(); и получаем что нужно.

Спустя 9 минут, 3 секунды (5.10.2009 - 18:14) sergeiss написал(а):
kirik - ты знаешь, твоя идея смотрится более оптимальной и наглядной...

Спустя 2 часа, 38 минут, 10 секунд (5.10.2009 - 20:52) UnWind написал(а):
kirik Спасибо за то что показал иной метод. Потому что я делал фактически так же как sergeiss, твой метод действительно гораздо лучше. smile.gif

Спустя 13 часов, 21 минута, 39 секунд (6.10.2009 - 10:14) linf написал(а):
А можно ли решить эту проблему на стадии заполнения?
то есть, если в массиве уже есть такая ячейка, в которой похожий [link], то просто не пишем.

Вот пример заполнения:

PHP
$file = file("base/base.csv"); //база.
$search = 'Быть+довольным'; //пример строки поиска.
$search_mass = explode("+", $search); //строку в массив.

for ($i=0; $i < count($file); $i++)    {
    for ($a=0; $a < count($search_mass); $a++)    {
            if (mb_substr_count($file[$i], $search_mass[$a], 'utf-8') >= 1) {
            $num += 1;
            $content = explode ("^", $file[$i]);
            $content = str_replace("#", "", $content);
            $out[$num][count] = mb_substr_count($file[$i], $search_mass[$a], 'utf-8');
            $out[$num][link] = $content[0];
            $out[$num][text] = mb_substr($content[1], mb_stripos($content[1], $search_mass[$a], 0, 'utf-8'), 200, 'utf-8');
                                                                                       }
                                                           }
                                          }

rsort($out); 

echo 
'<pre>';
print_r ($out);
echo '</pre>';


Пытался туда же где 'if' воткнуть условие по in_array не получилось, так как массив многомерный, к тому же не знаю как его применить в обратном значении...

Спустя 5 часов, 26 минут, 13 секунд (6.10.2009 - 15:40) linf написал(а):
Всем! спасибо, с этой задачей разобрался...

Спустя 18 дней, 10 часов, 23 минуты (25.10.2009 - 03:03) нда написал(а):
array_unique biggrin.gif

Спустя 1 час, 27 минут, 17 секунд (25.10.2009 - 04:30) kirik написал(а):
Цитата (нда @ 24.10.2009 - 19:03)
array_unique

Покажите как?

Спустя 2 месяца, 13 дней, 11 часов, 21 минута, 51 секунда (8.01.2010 - 15:52) Гость_Алексей написал(а):
if ($test=="1"){echo "Количество значений до =".count($arr)."<br>\n";}
$arr2=array_unique ($arr);
if ($test=="1"){echo "Количество знаний после =".count($arr2)."<br>\n";}

---------------
Администратор компьютерной барахолки oldcomp.ru


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

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