[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сравнить массивы.
linf
есть два массива оба текстовые, к примеру такие:

$a = array ('один', 'два', 'три', 'четыре', 'пять');
$b = array ('четыре', 'пять', 'шесть', 'семь','весемь');

нужно если хотя бы одни элемент массива $a равен хотя бы одном элементу массива $b, тогда echo "совпадение найдено"; (в идеале, указать количество этих совпадений)


сам побывал:
1. преобразовать в строки и находить вхождение. (не катит)
2. пересчитывать все циклами (ваще ужас)
3. различные ARRAY_XXXXXXXX (тоже как то у меня не работают)

Заранее спасибо.



Спустя 23 минуты, 30 секунд (28.07.2009 - 09:08) sergeiss написал(а):
А что именно сам пробовал? Код какой? Тут достаточно (ежели самому делать), цикл в цикле. И всё получится.

Спустя 4 минуты, 43 секунды (28.07.2009 - 09:13) linf написал(а):
я боюсь что цикл в цикле, это будет долго, так как объемы большие (это только в примере меленькие)... (да и парочка циклов у меня уже есть... очень много вложений полуается страшный код)

как нибудь можно еще?

Спустя 3 минуты, 21 секунда (28.07.2009 - 09:16) sergeiss написал(а):
Цитата (linf @ 28.07.2009 - 10:13)
как нибудь можно еще?

Можно еще поймать щуку и потом "по щучьему веленью" smile.gif Можно также попробовать использовать array_search()

Боишься многократных "циклов в цикле"? Сделай функцию, которая будет делать это сравнение (если нету желания использовать готовые функции). Код станет красивее.

Спустя 3 минуты, 22 секунды (28.07.2009 - 09:19) Dezigo написал(а):
PHP
<?php
$array1 
= array("a" => "green""red""blue""red");
$array2 = array("b" => "green""yellow""red");
$result array_diff($array1$array2);

print_r($result);


Цитата
Array
(
    [1] => blue
)


http://lv.php.net/array_diff

используй array_diff();

Спустя 1 минута, 38 секунд (28.07.2009 - 09:21) Michael написал(а):
Цикл пусти по одному массиву, а перебираемые значения
проверяй функцией in_array() в другом массиве до первого
совпадения

Спустя 4 минуты, 10 секунд (28.07.2009 - 09:25) Oyeme написал(а):
PHP
$a = array ('один''два''три''четыре''пять','h','zlo');
$b = array ('четыре''пять''шесть''семь','весемь','h','i','test','zlo','TEST');

$result array_diff($a,$b);
echo 
count($a)-count($result);

Спустя 1 минута, 48 секунд (28.07.2009 - 09:27) linf написал(а):
array_search у меня не работал... но я попробую еще разок... (тут оже с циклом)

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

------------------
$mass и $out - массивы

PHP
for ($a 0$a <=count($mass); $a++)    {$key array_search("$mass[$a]"$out); echo $key;}


выдал 4 ноля!

Спустя 24 секунды (28.07.2009 - 09:27) Sylex написал(а):
PHP
<?php

$a 
= array ('один''два''три''четыре''пять');
$b = array ('четыре''пять''шесть''семь','весемь');

$c array_intersect($a$b);

echo 
sizeof($c);


не знаю, насколько это производительно, но должно быть норм

Спустя 4 минуты, 29 секунд (28.07.2009 - 09:32) linf написал(а):
Вообще пишу поиск по текстовой базе, может дадите хотя бы подсказку в каком направлении нужно двигаться, или хотя бы ссылочку на примеры...

Спустя 1 минута, 44 секунды (28.07.2009 - 09:33) Sylex написал(а):
linf
от поставленной задачи идет ее решение

в чем сложности? чего боитесь? Поиском пользоваться умеем? Все найти можно...

Спустя 1 минута, 2 секунды (28.07.2009 - 09:35) twin написал(а):
Удивительное дело, но фореч всех победил по производительности:
PHP
$a1 = array ('один''два''три''четыре''пять');
$b1 = array ('четыре''пять''шесть''семь','весемь');

$i 0;
    foreach(
$a1 as $c1)
        if(
in_array($c1,$b1))
        ++
$i;
        
        if(!empty(
$i))
        echo 
'Найдено совпадений: '$i
        else
        echo 
'Тютя.';

Спустя 4 минуты, 33 секунды (28.07.2009 - 09:39) Sylex написал(а):
twin
PHP
<?php

$a 
= array ('один''два''три''четыре''пять');
$b = array ('четыре''пять''шесть''семь','весемь');

$t microtime(true);
$c array_intersect($a$b);
echo 
microtime(true)-$t'<br>';

echo 
sizeof($c);

$a1 = array ('один''два''три''четыре''пять');
$b1 = array ('четыре''пять''шесть''семь','весемь');

$t microtime(true);
$i 0;
foreach(
$a1 as $c1)
    if(
in_array($c1,$b1))
    ++
$i;
echo 
microtime(true)-$t'<br>';
   
    if(!empty(
$i))
    echo 
'Найдено совпадений: '$i
    else
    echo 
'Тютя.';

странно, у меня обратные результаты blink.gif

Спустя 53 секунды (28.07.2009 - 09:40) linf написал(а):
Sylex Поиском пользуюсь уже с 12 ночи, открыто примерно 40 вкладок сайта http://ru.php.net...

Кстати понял проблему, тот пример с array_intersect который ты привел, работает, но в маих массивах выдает нули...

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



Спустя 2 минуты, 14 секунд (28.07.2009 - 09:42) Sylex написал(а):
Цитата (linf @ 28.07.2009 - 12:40)
тот пример с array_intersect который ты привел, работает, но в маих массивах выдает нули...


какие еще нафик нули? Ты поясняйся!

Цитата (linf @ 28.07.2009 - 12:40)
как можно массив проверить?


что значит проверить?

Спустя 5 минут, 50 секунд (28.07.2009 - 09:48) linf написал(а):
Цитата (Sylex @ 28.07.2009 - 10:42)
Цитата (linf @ 28.07.2009 - 12:40)
тот пример с array_intersect который ты привел, работает, но в маих массивах выдает нули...


какие еще нафик нули? Ты поясняйся!

Цитата (linf @ 28.07.2009 - 12:40)
как можно массив проверить?


что значит проверить?

PHP
<?PHP 
if(empty($_GET['search']))         {echo "Строка поиска Пуста.";}    //проверяем есть ли значение.
elseif  (strlen($_GET['search']) < 3)    {echo "Недостаточно символов для Поиска.";} 
else { 
$search = isset($_GET['search'])?$_GET['search']:null;

//сканим все базы.
for ($f 1$f <= 4$f++) {    //количество баз, пока 4.
    
$file File("base/$f.csv"FILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);
    for (
$i =0$i <= count($file); $i++) {

    
//преобразовывем данные из файла встроку

    
$out explode('^'$file[$i]);    // получили массив. 
    
$line implode(" "$out);    //массив преобразовали в строку

    //преобразовываем запрос в массив.
    
$search chop($search);    //обрезаем двойные пробелы
    
$search trim($search);    //удаляем пробелы в начала и конце
    
$mass explode(" "$search);    //преобразуем строку в массив.


$c array_intersect($out$mass);

print_r $c// !!!!!!!!!!! ВОТ ТУТ НУЛИ ВЫДАЕТ!!!!!!

//тут будет код: "если есть хотя бы одно совпадение то, печатаем $line и пишем колличество совпадений."

                
}}

if (
$stat 0)    {echo '<BR><FONT color="#FF7755">Всего найдено '$stat' сайтов, содержащих: "'$search,'".</FONT>'; } 
else         {echo 
'<FONT color="#FF7755">Ничего не найдено.</FONT>';}}



Спустя 1 минута, 48 секунд (28.07.2009 - 09:50) linf написал(а):
Хм... видимо количество табов тут и у меня не совпадают, чето весь код поразъехался =)))

Спустя 7 минут, 31 секунда (28.07.2009 - 09:57) twin написал(а):
Sylex

Цитата
странно, у меня обратные результаты

А ты вот так сделай biggrin.gif

PHP
echo sizeof($c), '<br>';

Спустя 6 минут, 47 секунд (28.07.2009 - 10:04) Sylex написал(а):
twin
laugh.gif надо же как получилось biggrin.gif

но все равно функция грам быстрее чем перебор + in_array smile.gif

Спустя 7 минут, 8 секунд (28.07.2009 - 10:11) Sylex написал(а):
linf
много у меня замечаний к твоему коду... я понятия не имею что у тебя там в базе хранится... никаких нулей не должно там быть

Спустя 1 минута, 56 секунд (28.07.2009 - 10:13) Sylex написал(а):
функция chop() - алиас rtrim, она не удаляет двойные пробелы

Спустя 2 минуты, 11 секунд (28.07.2009 - 10:15) linf написал(а):
Sylex
в базе слова, к примеру:

один^два^три
четыре^пять^шесть

даже если я такие вожу в строку $search, все равно выдает нули...

Спустя 1 минута, 17 секунд (28.07.2009 - 10:17) linf написал(а):
Цитата (Sylex @ 28.07.2009 - 11:13)
функция chop() - алиас rtrim, она не удаляет двойные пробелы

А что она делет?
и как тогда вообще множественные пробелы (не тока двойные), заменить на 1?

Спустя 2 минуты, 24 секунды (28.07.2009 - 10:19) Sylex написал(а):
Цитата (linf @ 28.07.2009 - 12:48)
print_r $c;

print_r($c);

Спустя 1 минута, 8 секунд (28.07.2009 - 10:20) Sylex написал(а):
PHP
<?PHP 
$_GET
['search'] = 'строка для поиска указан есть проверка';

if(empty(
$_GET['search']))
    {echo 
"Строка поиска Пуста.";}    //проверяем есть ли значение.
    
elseif (strlen($_GET['search']) < 3)
        {echo 
"Недостаточно символов для Поиска.";} 
    else { 
    
    
$search $_GET['search'];

    
//сканим все базы.
    
for ($f 1$f <= 1$f++) {    //количество баз, пока 4.
        
$file File("base/$f.csv"FILE_IGNORE_NEW_LINES FILE_SKIP_EMPTY_LINES);
        for (
$i =0$i <= count($file); $i++) {

        
//преобразовывем данные из файла встроку

        
$out explode('^'$file[$i]);    // получили массив. 
        
$line implode(" "$out);    //массив преобразовали в строку

        //преобразовываем запрос в массив.
        
$search trim($search);    //удаляем пробелы в начала и конце
        
$mass explode(" "$search);    //преобразуем строку в массив.


    
$c array_intersect($out$mass);

    
print_r ($c); // !!!!!!!!!!! ВОТ ТУТ НУЛИ ВЫДАЕТ!!!!!!

    //тут будет код: "если есть хотя бы одно совпадение то, печатаем $line и пишем колличество совпадений."

                    
}}

    if (
$stat 0)    {echo '<BR><FONT color="#FF7755">Всего найдено '$stat' сайтов, содержащих: "'$search,'".</FONT>'; } 
    else         {echo 
'<FONT color="#FF7755">Ничего не найдено.</FONT>';}}


файл 1.csv:
HTML
вообщем^есть^шаблон^в^папке^shabs^по^нему^он
лепит^дорвеи^указан^макрос^сам^этого


результат:
HTML
Array ( [1] => есть ) Array ( [2] => указан ) Array ( )


т.е. все верно работает...

Спустя 2 минуты, 13 секунд (28.07.2009 - 10:22) Sylex написал(а):
Цитата (linf @ 28.07.2009 - 13:17)
и как тогда вообще множественные пробелы (не тока двойные), заменить на 1?


PHP
$s 'проверка  множеств ыва    проверка  работает  а ';
echo 
preg_replace('/\s+/m'' '$s);

Спустя 44 секунды (28.07.2009 - 10:23) Sylex написал(а):
linf
и вообще поиск ты некорректно делаешь.. можно проще и эффективней, ну все равно, старайся, набирайся опыта smile.gif

Спустя 1 минута, 11 секунд (28.07.2009 - 10:24) linf написал(а):
все, до меня дошло что не так, порекомендуйте вообще что нибуть по разработке поиска на PHP почитать...

Спустя 48 секунд (28.07.2009 - 10:25) linf написал(а):
Цитата (Sylex @ 28.07.2009 - 11:23)
linf
и вообще поиск ты некорректно делаешь.. можно проще и эффективней, ну все равно, старайся, набирайся опыта smile.gif

ХАЧУ ПРОЩЕ И ЭФФЕКТИВНЕЕ!!!!!!!!!!!!!!!!!!!!

Спустя 7 минут, 22 секунды (28.07.2009 - 10:32) Sylex написал(а):
linf
тогда узнавай что такое базы данных и как производить в них поиск

гугла, яндекс - тебе в помощь

Спустя 41 секунда (28.07.2009 - 10:33) Sylex написал(а):
linf
а если все же на файлах хочешь - за тебя тут писать никто не будет... только за отдельную плату smile.gif

Спустя 7 минут, 23 секунды (28.07.2009 - 10:41) linf написал(а):
=((


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

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