Есть ли в PHP лучшая структура данных, кроме массива или библиотеки SPL для точного совпадения пар ключей <->?

Я ищу структуру данных, которая возвращает совпадающее значение, где, когда вход представляет собой одно целочисленное значение, у него есть только одно точное целочисленное совпадение. Например, если я введу 1, он вернет 2, или если я введу 2, он вернет 1. У меня уже есть одно решение (см. Ниже). Однако я чувствую, что должна быть структура данных, имеющая такой формат: 1 <=> 5, 3 <=> 6, и т. д. У меня нет лет знаний PHP, поэтому я не уверен, что я просто не знаю о собственной структуре данных, которая делает это. Я также понимаю, что этого может не быть, я просто хочу убедиться, что этого не существует.

На данный момент у меня просто есть массив с парами ключ-значение для каждого соответствующего значения. (Я также сделал то же самое с оператором switch, но он выглядел менее чистым). Это выглядит так:

function vs_get_matching_number($number){
      $matching_numbers = array(
       1 => 3,
       3 => 1,
       4 => 6,
       6 => 4
     );
     return $matching_numbers[(int)$number];
   }

Если я перефразирую, у вас есть ассоциация между двумя числами, и если вы спросите число, вы получите связанный номер? Количество ассоциаций закончилось?

SmasherHell 01.04.2022 16:14

Взгляните на Расширение структур данных

Solrac 01.04.2022 16:25

Вы точно описываете разреженный массив, который уже реализован в PHP. Если массив не соответствует вашим требованиям, вы должны объяснить, почему.

symcbean 01.04.2022 16:35

@SmasherHell Да, то, что вы описали, верно. Будет установлено количество ассоциаций.

Joseph Harburg 01.04.2022 17:17

@symcbean Я пытаюсь использовать те инструменты, которые могут быть изначально доступны в PHP, не изобретая, так сказать, колесо.

Joseph Harburg 01.04.2022 17:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы пытаетесь сопоставить числа в любом направлении, вы можете сделать что-то вроде этого. Он по-прежнему использует массив, но уменьшает дублирование.

  • array_search() можно использовать для поиска ключа на основе значения
  • isset() можно использовать для проверки существования ключа перед возвратом значения.

Исключение может быть выдано, если число не найдено, это может быть обработано с помощью оператора try catch.

<?php
function vs_get_matching_number($number) {
    $matchingNumbers = [
            1 =>3,
            4 =>6,
        ];
        
    if (isset($matchingNumbers[$number])) {
        return $matchingNumbers[$number];
    }
   
    $keyNumber = array_search($number, $matchingNumbers);
    if ($keyNumber) {
        return $keyNumber;
    }
   
    throw new \Exception('Unknown number: '.$number);
   
}

echo vs_get_matching_number(1) ."\n";
echo vs_get_matching_number(3) ."\n";
echo vs_get_matching_number(4) ."\n";
echo vs_get_matching_number(6) ."\n";
echo vs_get_matching_number(5) ."\n";
Ответ принят как подходящий

Массив действительно лучший выбор, несмотря на свое название, на самом деле это хэш-карта, а это то, что вам действительно нужно. Это встроенный в PHP тип, который можно использовать в любом другом коде без зависимостей (например, нет необходимости в специальном расширении или дополнительном коде).

На основе «исходного» массива с односторонним сопоставлением вы можете сделать это следующим образом:

function array_flip_merge($arr) {
    $result = $arr;
    $flip = array_flip($arr);
    foreach($flip as $k => $v) {
        $result[ $k ] = $v;
    }
    return $result;
}

$source = [
   1 => 3,
   4 => 6,
];

$result = array_flip_merge($source);

array_flip() создаст второй массив с обменянными ключами и значениями. Это, вставленное в исходный массив, создаст желаемый выходной массив.

Array
(
    [1] => 3
    [4] => 6
    [3] => 1
    [6] => 4
)

Обратите внимание, что в функции нет никаких проверок, поэтому она не заметит несоответствия в исходном массиве (например, если один из ключей или значений дублируется). Но это тоже можно реализовать...

Другие вопросы по теме