在PHP中使用数组作为数组的键

时间:2011-08-10 23:03:50

标签: php arrays map

我需要在Array和Number之间创建一个关联;由于PHP缺少Map类型,我正在尝试使用数组来实现这一点:

$rowNumberbyRow = array();
$rowNumberByRow[$rowData] = $rowNumber;

但是,当我评估代码时,我收到以下错误:

Warning: Illegal offset type

请注意,存储在数组($rowData)中的数据没有任何“唯一”值,我可以将其用作$rowNumberByRow数组的键。

谢谢!

更新 为了回答我的一些评论者,我试图创建一个lookup table,以便我的应用程序可以在O(1)时间内找到给定行的行号。

4 个答案:

答案 0 :(得分:7)

PHP确实有一个地图类:它叫做SplObjectStorage。可以使用与通用数组完全相同的语法访问它(参见the reference上的示例#2)。

但要使用该类,您必须使用the ArrayObject class而不是数组。它的处理方式与数组完全相同,您可以从数组构造实例(例如$arrayObject = new ArrayObject($array))。

如果您不想使用这些类,您还可以创建一个为索引创建唯一哈希字符串的函数。例如:

function myHash($array){
   return implode('|',$array);
}
$rowNumberByRow[myHash($array)] = $rowNumber;

您当然必须确保您的哈希值确实是唯一的,我强烈建议您使用SplObjectStorage,并且可以阅读更多关于PHP的SPL类的内容。

答案 1 :(得分:2)

为什么不将行号存储在数组中? e.g:

$rowData['rowNumber'] = $rowNumber;

您可以改为序列化数组,例如:

$rowNumberByRow[serialize($rowData)] = $rowNumber;

然而,效率非常低。

答案 2 :(得分:1)

在php中,您只能使用标量值作为数组键。

如果您的$rowNumber是唯一的 - 那么您将尝试使用相反的关系方向。如果它不是唯一的 - 那么你就没有我知道的任何可能的解决方案。

答案 3 :(得分:0)

答案已经给出并接受了,但是当我在寻找类似的问题时,我发现了这个问题,我觉得我应该放弃一条线:当有人想要使用带有值的数组作为另一个的键时数组,使用函数array_combine会很有用。

如果我正确地获得了数组,你可以使用:

$rowNumberByRow = array_combine($rowData, $rowNumber);

请查看PHP手册以查看有关密钥允许值的一些信息:)