PHP: фильтрация многомерных массивов по неравным значениям для исключения дублированных записей - PullRequest
0 голосов
/ 23 апреля 2020

Это частичный дубликат нескольких других постов, но немного другой. Сними со мной и простите, если это уже было описано в анналах StackOverflow.

Ниже приведены два массива из двух разных каналов, они имеют разные идентификаторы. Из-за этого я должен полагаться на «BriefTitle»: по «BriefTitle» и другим данным (например, [LocationCountry], [StartDate], [Condition]) я могу сказать, что это та же самая запись. Я хотел бы взять substr из «BriefTitle», чтобы сравнить его с другими записями «BriefTitle», чтобы отфильтровать дубликаты, так как они содержатся друг в друге. Я не ищу точное соответствие, которое я нашел здесь для большинства решений.

Мне нравится краткое решение, предложенное sevavietl / mickmackusa: php удаление дубликатов из многомерного массива по значению

$result = array_reverse(array_values(array_column(
    array_reverse($data),
    null,
    'BriefTitle'
)));

однако мой BriefTitle является массивом (кажется, не работает с array_column), и я не уверен, как применить функцию substr к решению, приведенному выше.

Несколько быстрых заметок:

  • К счастью, [BriefTitle] [0] всегда является значением для сравнения
  • Если возможно, я бы хотел просто захватить первый экземпляр для набор данных, отвергая любые последующие дубликаты.

Есть мысли, как мне подойти к этому? Массивы:

 [0] => Array
        (
            [Rank] => 422
            [id] => Array
                (
                    [0] => 152091
                )

            [Condition] => Array
                (
                    [0] => Depression
                    [1] => Ketamine
                )

            [BriefTitle] => Array
                (
                    [0] => Positron Emission Tomography Assessment of Ketamine Binding of the Serotonin Transporter
                )

            [LocationCountry] => Array
                (
                    [0] => Austria
                )

            [StartDate] => Array
                (
                    [0] => May 5, 2016
                )

            [LastUpdatePostDate] => Array
                (
                    [0] => October 15, 2018
                )

            [Entheogen] => ketamine
            [Source] => clinicaltrials.gov
        )   


    [1] => Array
        (
            [Rank] => 6673
            [id] => Array
                (
                    [0] => YSBSZ18291
                )

            [Condition] => Array
                (
                    [0] => Depressive Disorder
                    [1] => Ketamine
                )

            [BriefTitle] => Array
                (
                    [0] => Positron Emission Tomography assessment of Ketamine Binding of the Serotonin Transporter and its Relevance for Rapid Antidepressant Response
                    [1] => Die Rolle des Serotonintransporters bei der akuten antidepressiven Wirkung von Ketamin, untersucht mit Positronen-Emissions-Tomographie
                )

            [LocationCountry] => Array
                (
                    [0] => Austria
                )

            [StartDate] => Array
                (
                    [0] => 2016 05 01
                )

            [LastUpdatePostDate] => Array
                (
                    [0] => 2018 10 15
                )

            [Entheogen] => ketamine
            [Source] => clinicaltrialsregister.eu
        )

1 Ответ

1 голос
/ 23 апреля 2020

К сожалению, из-за характера ваших данных (строки, которые могут совпадать, могут быть подстроки других, с другим регистром), единственный реальный вариант - это перебор. L oop над массивом, сохраняя заголовки при go и проверяя, совпадает ли текущий заголовок с любым из них:

$result = array();
$brieftitles = array();
foreach ($array as $arr) {
    $foundtitle = false;
    $title = $arr['BriefTitle'][0];
    foreach ($brieftitles as $btitle) {
        $foundtitle = (stripos($title, $btitle) !== false) || (stripos($btitle, $title) !== false);
        if ($foundtitle) break;
    }
    if (!$foundtitle) {
        $result[] = $arr;
        $brieftitles[] = $arr['BriefTitle'][0];
    }
}
print_r($result);

Демонстрация на 3v4l.org

...