PHP 中是否有比数组或 SPL 库更好的数据结构用于精确匹配的键 <-> 键对?

Is there a better data structure in PHP other than array or SPL library for exact matched key <-> key pairs?

我正在寻找一种数据结构,它 returns 一个匹配值,当输入是一个整数值时,它只有一个完全匹配的整数。例如,如果我输入 1 it returns 2 或者如果我输入 2 it returns 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];
   }

您似乎正试图在任一方向映射数字,您可以这样做。它仍然使用数组,但减少了重复。

  • 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";

A​​rray确实是最好的选择,尽管它的名字实际上是一个Hashmap,这才是你真正想要的。它是 PHP-native 类型,可由任何其他代码使用而无需依赖(例如,不需要特殊扩展或附加代码)。

基于仅具有 one-way 映射的“源”数组,您可以这样做:

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
)

请注意,函数中没有任何检查,因此它不会注意到源数组中的不一致(f.e。如果其中一个键或值重复)。但它也可以实现...