PHP соответствует строке через запятую со значением массива, но не в точном порядке - PullRequest
0 голосов
/ 04 марта 2020

У меня, возможно, простой запрос, но нигде не удалось найти точного решения.

Существует строка с разделителями-запятыми, например 1,3 , и массив со значениями, такими как 1,3,2 ИЛИ 3,1,4 . Мне нужна функция, которая, когда я пытаюсь найти эту строку в массиве, возвращает TRUE для обеих записей, поскольку числа 1 и 3 существуют в обоих значениях массива, но только в другом порядке.

Я пытался использовать array_search, strpos и даже explode для первого создания строки в массиве, а затем array_intersect для пересечения обоих массивов в надежде получить положительное совпадение, но всегда возвращает только массив со значениями 1,3,2, а не 3,1,4.

Любые предложения или указатели будут чрезвычайно полезны.

Заранее большое спасибо.

============================

PS: Вот мой код

        //Enter your code here, enjoy!
$st_array = array();
$st_data1['id'] = 1;
$st_data1['title'] = 'Jane doe';
$st_data1['disk'] = '1,3,2';
array_push($st_array, $st_data1);

$rc_disk_id = '1,3';

$st_data2['id'] = 2;
$st_data2['title'] = 'Jane Smith';
$st_data2['disk'] = '3,1,4';
array_push($st_array, $st_data2);


foreach($st_array as $st_data) {
    $rc_disk_ids = explode(",",$rc_disk_id);
    $match = array_intersect($rc_disk_ids, $st_data);
    if (!empty($match)) {
        echo "\nFound\n";
        print_r($st_data);
    }
    else {
        echo "Nope!";
    }
}

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

Ваш код очень близок. Вам также необходимо explode список идентификаторов дисков в $st_data, а затем использовать array_diff, чтобы проверить, являются ли все значений в $rc_disk_ids присутствуют в этом списке:

foreach($st_array as $st_data) {
    $rc_disk_ids = explode(",",$rc_disk_id);
    $st_disk_ids = explode(',', $st_data['disk']);
    $match = array_diff($rc_disk_ids, $st_disk_ids);
    if (empty($match)) {
        echo "\nFound\n";
        print_r($st_data);
    }
    else {
        echo "Nope!";
    }
}

Вывод для ваших образцов данных:

Found
Array
(
    [id] => 1
    [title] => Jane doe
    [disk] => 1,3,2
)

Found
Array
(
    [id] => 2
    [title] => Jane Smith
    [disk] => 3,1,4
)

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

0 голосов
/ 04 марта 2020

Может быть, вы можете попробовать поискать строку вместо сравнения массивов.

$strArr = explode(",", "1,3");
$arrToBeSearched = ["1", "3", "2"];

foreach($strArr as $val){
    if(!in_array($val, $arrToBeSearched){
        return FALSE;
    }
}

// If it reaches here, then all values in 
//the $strArr where found in the 
//$arrToBeSearched
return TRUE;
...