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

Замечания: Для downvoter и для тех, кто нуждается в дополнительных разъяснениях …

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

Извините за сумасшедший титул. Я пытаюсь добиться того, чтобы у меня было два массива:

$full = array("Apple", "Orange", "Mango", "Guava", "Tomato");
$user = array("Apple", "Orange", "Tomato");

Я получаю это как JSON, и я использую json_decode() преобразовать его в массив из JSON. Теперь мой вопрос, я хочу использовать этот ввод для моей функции, которая возвращает мне что-то вроде этого:

$userSelection = array(
"Apple" => true,
"Orange" => true,
"Mango" => false,
"Guava" => false,
"Tomato" => true
);

Для этого я мог бы сделать что-то вроде:

function userSelection ($full, $user)
{
$final = array();
foreach ($full as $fruit)
if (in_array($fruit, $user))
$final[$fruit] = true;
else
$final[$fruit] = false;
return $final;
}

Чтобы сжать несколько бит, я использовал это.

function userSelection ($full, $user)
{
$final = array();
foreach ($full as $fruit)
$final[$fruit] = in_array($fruit, $user);
return $final;
}

У меня вопрос, есть ли другой лучший способ сделать это?

0

Решение

Если вы интересуетесь анализом производительности: foreach () — это O (N) (поразить каждый элемент в $ full), а in_array — также O (N) (посмотрите на каждое значение в $ user), так что цикл является худшим В случае O (N ^ 2). Если у вас много фруктов, это узкое место в производительности.

Вы можете уменьшить это, превратив $ full в ассоциативный массив:

$full = array("Apple" => false
, "Orange" => false
, "Mango" => false
, "Guava" => false
, "Tomato" => false);

Тогда userSelection становится:

function userSelection ($full, $user)
{
// $full is passed by value (ie copied)
foreach ($user as $fruit) {
// check to avoid fruit injection attacks
if (array_key_exists($fruit, $full))
{ $full[$fruit] = true; }
return $full;
}

Аргумент array_key_exists должен быть либо O (log N), либо O (1), в зависимости от реализации PHP, в то время как цикл for остается O (N) для производительности O (N * log N) в худшем случае.

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

3

Другие решения

Ты можешь использовать array_intersect чтобы найти элементы $ user в $ full и / или array_diff или какие элементы из $ full отсутствуют в $ user

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector