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

0

Примечание: для 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
    Для чего ты ищешь? Как решение в одну строку?
  • 0
    Вы не можете сжать больше, чем вы сделали в сжатой функции ...
Показать ещё 1 комментарий
Теги:
arrays
performance
coding-style

2 ответа

3
Лучший ответ

Если вы заинтересованы в анализе производительности: 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).

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

  • 0
    Добавлено голосование вверх! Спасибо, приятель.
1

Вы можете использовать array_intersect, чтобы узнать, какие элементы из $ user находятся в $ full и/или array_diff или какие элементы из $ full не входят в $ user

  • 0
    Я знаю это. Тогда ладно?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню