PHP: фильтровать массив A в соответствии с массивом B - PullRequest
0 голосов
/ 05 апреля 2020

Я звоню Ajax, чтобы отфильтровать значения из массива следующим образом:

<?php

    $dataset = array_filter($_REQUEST['dataset'], function ($v){
        return filterArray($_REQUEST['keyword'], $v);
    });

    function filterArray($needle,$haystack){
        $needle = strtolower($needle);
        foreach($haystack as $v){
            if (stripos($v, $needle) !== false){
                return true;
            }
        };
    }
    echo json_encode($dataset, JSON_UNESCAPED_UNICODE);

?>

Благодаря помощи окружающих, теперь это работает как шарм.

Однако мне нужно кое-что более сложное:

У меня есть два почти идентичных массива, импортированных в файл php через AJAX. Давайте назовем их «cleanDataset» и «rawDataset».

Они в основном клоны, но «rawDataset» является оригиналом, а «cleanDataset» является копией, свободной от тега html и нежелательных символов, которые я не использую. Я не хочу быть частью поиска. Различия невелики, но многочисленны и непредсказуемы.

Итак, я хотел бы выполнить поиск "cleanDataset" по выбранному ключевому слову, но я бы хотел, чтобы вместо этого "rawDataset" был отфильтрован и возвращен в javascript file.

К сожалению, в приведенном выше коде искомый массив также является фильтруемым.

Итак, в основном это то, что я пробовал, но это не так. работа:

<?php

    $rawDataset = array_filter($_REQUEST['rawDataset'], function ($v){
        return filterArray($_REQUEST['keyword'], $_REQUEST['cleanDataset']);
    });

    function filterArray($needle,$haystack){
        $needle = strtolower($needle);
        foreach($haystack as $v){
            if (stripos($v, $needle) !== false){
                return true;
            }
        };
    }
    echo json_encode($rawDataset, JSON_UNESCAPED_UNICODE);

?>

Я получаю сообщение "jSon Parse error: нераспознанный маркер" <"" при попытке отобразить выходной массив с console.log (). И кроме того, мне кажется, что я очень быстро исчерпал возможности, основанные на моих небольших знаниях. В скрипте нет другого места, где я мог бы перенаправить фильтрацию из cleaDataset в rawDataset. Я искал в Интернете похожий случай, но не смог найти. </p>

Любая помощь будет признательна. Спасибо.

1 Ответ

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

Вот мое предложение. Вы можете передать «внешние» переменные в функцию обратного вызова через ключевое слово use.

Также array_filter() может передать ключ элемента вместе со значением, используя ARRAY_FILTER_USE_BOTH flag

Здесь я немного упростил код, чтобы сделать его более читабельным, но, по сути, он должен работать и все еще показывает мою идею

$keyword = 'abc';
$cleanDataset = ['abcd', 'zabcd', 'awbcd', 'as abc d abc'];
$rawDataset = ['abcd<br>', '<p>zabcd', '<strong>awbcd', 'as <code>abc</code> d abc'];

$rawDataset = array_filter($rawDataset, function ($v, $k) use ($keyword, $cleanDataset) {
    return findWord($keyword, $cleanDataset[$k]);
}, ARRAY_FILTER_USE_BOTH);

function findWord($needle,$haystack){
    $needle = strtolower($needle);
    return (boolean) (stripos($haystack, $needle) !== false);
}
...