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";
Array确实是最好的选择,尽管它的名字实际上是一个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。如果其中一个键或值重复)。但它也可以实现...
我正在寻找一种数据结构,它 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";
Array确实是最好的选择,尽管它的名字实际上是一个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。如果其中一个键或值重复)。但它也可以实现...