Только уникальные элементы в массиве - PullRequest
0 голосов
/ 17 января 2020

Есть канал, из которого я получаю данные, и иногда в нем появляются очень похожие записи. https://dl4.joxi.net/drive/2020/01/17/0028/2950/1842054/54/5abb738180.jpg

Я хочу убедиться, что массив содержит самые уникальные записи. (Определить по названию)

Код:


$new = array();
$goodFeed = array();

$itemlimit=0;
$itemlimit2=0;


foreach ($feed->get_items() as $item) {
    if ($itemlimit==50) { break; };
    $new[] = strtolower(trim($item->get_title()));
    $itemlimit = $itemlimit + 1;
}

foreach ($feed->get_items() as $item) {
    if ($itemlimit2==50) { break; };
    $itemTitle = strtolower(trim($item->get_title()));

    foreach($new as $item2) {
        similar_text($item2, $itemTitle, $percent);

        if ($percent < 78 && !in_array($item, $goodFeed)) {
                $goodFeed[] = $item;
                echo 'added: ' . $item->get_title() . '<br>Procent: ' . $percent . '<hr>';

        }
    }

    $itemlimit2 = $itemlimit2 + 1;
}

Я хочу, чтобы в массиве $ goodFeed оставались только уникальные значения (минимум 80%). Теперь он содержит элементы, которые очень похожи друг на друга. В исходном фиде есть элементы с именами:

1. Metro Redux on Nintendo Switch™ Announce Trailer; 
2. Metro Redux on Nintendo Switch™ Announce Trailer [NA]; 
3. Metro Redux für Nintendo Switch™ Ankündigungs-Trailer [DE]; 
4. Metro Redux on Nintendo Switch™ Announce Trailer [ANZ]; 
5. The Elder Scrolls Online: The Dark Heart of Skyrim Announcement Cinematic;
6. The Elder Scrolls Online - The Dark Heart of Skyrim Cinematic Announcement Trailer

Все они go в $ goodFeed, я хочу только эти:

1. Metro Redux on Nintendo Switch™ Announce Trailer
5. The Elder Scrolls Online: The Dark Heart of Skyrim Announcement Cinematic 

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 января 2020

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

Если кто-то знает хороший и все еще поддерживаемый парсер RSS (NodeJs, Php), который может комбинировать в один, я был бы признателен, если бы вы могли ссылку на него.

0 голосов
/ 17 января 2020
I have not tested but I think one of these should work for you.

foreach ($feed->get_items() as $item) { 
    if(!strtolower(trim($item->get_title())),$new){
        if ($itemlimit==50) { break; };
        $new[] = strtolower(trim($item->get_title()));
        $goodFeed[] = $item;
        $itemlimit = $itemlimit + 1;
    }
}

-------OR-------

foreach ($feed->get_items() as $item) { 
    if(!strtolower(trim($item->get_title())),$new){
        if(count($new)>0){
            $percent=0;
            foreach($new as $n){
                similar_text($n, strtolower(trim($item->get_title())), $percent);
                if($percent>78){
                    break;
                }
            }
            if($percent>78){
                    continue;
            }

            if ($itemlimit==50) { break; };
            $new[] = strtolower(trim($item->get_title()));
            $goodFeed[] = $item;
            $itemlimit = $itemlimit + 1;
        }
        else{
            $new[] = strtolower(trim($item->get_title()));
            $goodFeed[] = $item;
            $itemlimit = $itemlimit + 1;
        }
    }
}
...