Сравнение двух массивов в PHP в случайном порядке - PullRequest
1 голос
/ 27 апреля 2019

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

Я пробовал array_intersect, но это не работает, если номер, который я ищу, не в том же порядке.

$array1 = [1,2];
$array2 = [2,3];

$result = array_intersect($array1, $array2);

$result возвращает false, но я хочу, чтобы он понял, что 2 существует в обоих массивах, и возвращает true.

Я думаю, что у этого есть простое решение, но я не могу найти ничего, что работает.

ОБНОВЛЕНИЕ:

Вот полный код (с использованием PHP, Laravel):

$student = User::find($id);
$studentLocations = $student->hospital()->pluck('id');
$preceptorLocations = Auth::user()->hospital()->pluck('id');

$result = array_intersect($studentLocations, $preceptorLocations);

Если если вернуть результаты каждого:

[2] // studentLocations
[1,2] // preceptorLocations

Но с полным кодом выше я получаю:

"array_intersect(): Argument #1 is not an array"

Если я, например, изменится на array($student->hospital()->pluck('id')), он не выдаст ошибку, не вернет true, а когда я верну только результаты, они будут такими:

[[2]]

Ответы [ 6 ]

1 голос
/ 27 апреля 2019

Чтобы проверить, есть ли ожидаемый идентификатор в вашем массиве:

if(in_array($studentLocations, $preceptorLocations)){
    //Your code
}

Функция in_array () проверяет, существует ли значение в массиве.Предполагая, что $ StudentsLocations является целым числом.Если это массив

if (!array_diff($studentLocations, $preceptorLocations)) {
    //Your code
};

array_diff вычисляет разницу массивов.

--- UPDATE ---

Вы можете использовать laravel intersect () метод проверки наличия какого-либо элемента первой коллекции во второй коллекции.В этом случае функция возврата счетчика больше 0.

if (count($studentLocations->intersect($preceptorLocations))>0) {
        //Your code here
} 

Laravel 5.8 Документация по коллекциям

0 голосов
/ 27 апреля 2019

Вы можете полностью избежать использования array_intersect, используя whereIn() в своем запросе.

$student = User::find($id);
$studentLocations = $student->hospital()->pluck('id')->toArray();
$result = Auth::user()->hospital()->whereIn('id',$studentLocations)->pluck('id')->toArray();
0 голосов
/ 27 апреля 2019

Я думаю, это потому, что laravel дает вам collection, следовательно, это не массив, а Collection, так что вы не получите желаемый результат. поэтому сначала преобразуйте ваш collection в array, а затем передайте этот массив вашему function для конвертации вы можете использовать toArray() коллекции.

$studentLocations = $student->hospital()->pluck('id')->toArray();
$preceptorLocations = Auth::user()->hospital()->pluck('id')->->toArray();

Это должно работать.

0 голосов
/ 27 апреля 2019

В моем исходном сообщении была эта проблема, которая не работала, я описал ее в основных терминах, а затем с реальным кодом.

$student = User::find($id);
$studentLocations = $student->hospital()->pluck('id');
$preceptorLocations = Auth::user()->hospital()->pluck('id');

$result = array_intersect($studentLocations, $preceptorLocations);

Решение было, в Laravel, pluck возвращает объект.Добавив toArray() в конец переменных, теперь он работает отлично.

$student = User::find($id);
$studentLocations = $student->hospital()->pluck('id')->toArray();
$preceptorLocations = Auth::user()->hospital()->pluck('id')->toArray();

$result = array_intersect($studentLocations, $preceptorLocations);
0 голосов
/ 27 апреля 2019
$array1 = [1,2];
$array2 = [2,3];

$result = array_intersect($array1, $array2);
print_r($result);

это печатает Array ([1] => 2), поскольку ключи сохраняются с array_intersect

где, как будто вы извлекаете значения, вы получите результат без сохранения ключей

$result = array_values(array_intersect($array1, $array2));
print_r($result);

печатает Array ([0] => 2)

0 голосов
/ 27 апреля 2019

Вы можете проверить свой PHP-скрипт и оставить символ, который может привести к другим ошибкам. Это работает:

$array1 = [1, 12, 9, 101, 2, 22, 14];
$array2 = [2, 3, 10, 22, 14, 0];

if (is_array($array1) && is_array($array1)) {
    $result = array_intersect($array1, $array2);

    if (sizeof($result) > 0) {
        $output = "\n";
        foreach ($result as $value) {
            $output .= 'Value ' . $value . " is in both arrays.\n";
        }
        echo $output;
    } else {
        echo "Sorry! There is no result!\n";
    }

}else{
    echo "Sorry! One or both of inputs are not in array form!"
}

Выход:

string(84) "
Value 2 is in both arrays.
Value 22 is in both arrays.
Value 14 is in both arrays.
"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...