我需要在Array和Number之间创建一个关联;由于PHP缺少Map类型,我正在尝试使用数组来实现这一点:
$rowNumberbyRow = array();
$rowNumberByRow[$rowData] = $rowNumber;
但是,当我评估代码时,我收到以下错误:
Warning: Illegal offset type
请注意,存储在数组($rowData
)中的数据没有任何“唯一”值,我可以将其用作$rowNumberByRow
数组的键。
谢谢!
更新 为了回答我的一些评论者,我试图创建一个lookup table,以便我的应用程序可以在O(1)时间内找到给定行的行号。
答案 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手册以查看有关密钥允许值的一些信息:)