Я ищу структуру данных, которая возвращает совпадающее значение, где, когда вход представляет собой одно целочисленное значение, у него есть только одно точное целочисленное совпадение. Например, если я введу 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];
}
Взгляните на Расширение структур данных
Вы точно описываете разреженный массив, который уже реализован в PHP. Если массив не соответствует вашим требованиям, вы должны объяснить, почему.
@SmasherHell Да, то, что вы описали, верно. Будет установлено количество ассоциаций.
@symcbean Я пытаюсь использовать те инструменты, которые могут быть изначально доступны в PHP, не изобретая, так сказать, колесо.
Похоже, вы пытаетесь сопоставить числа в любом направлении, вы можете сделать что-то вроде этого. Он по-прежнему использует массив, но уменьшает дублирование.
Исключение может быть выдано, если число не найдено, это может быть обработано с помощью оператора 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
)
Обратите внимание, что в функции нет никаких проверок, поэтому она не заметит несоответствия в исходном массиве (например, если один из ключей или значений дублируется). Но это тоже можно реализовать...
Если я перефразирую, у вас есть ассоциация между двумя числами, и если вы спросите число, вы получите связанный номер? Количество ассоциаций закончилось?