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

9

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

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

然而,当我评估代码时,出现以下错误:Warning: Illegal offset type。请注意,存储在数组($rowData)中的数据没有任何可用作$rowNumberByRow数组键的“唯一”值。谢谢!更新:为了回答我的一些评论者,我正在尝试创建一个查找表,以便我的应用程序可以在O(1)时间内找到给定行的行号。

$rowNumberByRow [ $rowData ['your_key'] ] = $rowNumber; - bensiu
@Jacek_FH 我正在尝试创建一个查找表,以便可以检索给定行的行号。 - JonnyReeves
1
@bensiu - 正如我在问题中所说的,$rowData 中的任何字段都不足以作为键使用 ;) - JonnyReeves
在这里做了些东西:https://dev59.com/b1HTa4cB1Zd3GeqPR3yZ#4053754 - mario
4个回答

9

PHP有一个Map类:它被称为SplObjectStorage。可以使用与一般数组完全相同的语法访问它(请参见参考文献的示例#2)。

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

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

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

当然,你需要确保你的哈希值确实是唯一的,我强烈建议你使用SplObjectStorage并且可能需要多了解一些php的SPL类。


谢谢,我不知道这些类! - JonnyReeves
我忘了提到:SplObjectStorage将按实例索引,而不是按对象内容索引,因此您必须保留ArrayObjects。如果您想要基于内容的映射,您将需要编写哈希函数,如我的答案的第二部分所概述的那样。 - Chronial
1
当我尝试将一个数组作为键分配时,PHP会抛出以下警告:“Warning: SplObjectStorage::offsetSet() expects parameter 1 to be object, array”。 - JonnyReeves
@JonnyReeves,请注意类名... Spl Object Storage。 - salathe
@JonnyReeves - 你注意到Chronial关于实例与内容的评论了吗? - Long Ears
显示剩余7条评论

2
为什么不在数组中直接存储行号呢?例如:
$rowData['rowNumber'] = $rowNumber;

你可以将数组序列化,例如:
$rowNumberByRow[serialize($rowData)] = $rowNumber;

然而,这种方式相当低效。

是的,我也考虑过这个,但我得出了同样的结论 - 这是一种非常糟糕的尝试实现查找表的方式 :( - JonnyReeves

1
在 PHP 中,你只能使用标量值作为数组键。
如果你的 `$rowNumber` 是唯一的,那么你应该尝试使用相反的关系方向。如果不是唯一的,则我不知道有什么解决方法。

-1
答案已经给出并被接受,但是当我在寻找类似问题时,我发现了这个问题,并且我觉得我应该留下一行:当有人想要使用一个值数组作为另一个数组的键时,使用函数array_combine会很有用。
如果我正确理解了数组,你可以使用:
$rowNumberByRow = array_combine($rowData, $rowNumber);

请查看PHP手册以了解有关键值允许值的一些信息 :)

array_combine()中,不能将二维数组用作键参数。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接