php如何以一个对象作为数组下标?


好像只能以字符串或数字作为数组下标,但目前我需要用对象来标识数组中的一个记录,
并尝试了如下代码:

$obj = new myClass();
$my_array[$obj]


但这样做不行,会出现 Warning: Illegal offset type

如果在c语言的话,可以取变量的地址,php有没有类似的办法呢?

先谢谢了

10 个解决方案

#1


使用对象名吧,get_class($obj),php貌似没有这个方法,当然个人觉得也没必要这样用,楼主是啥情况 要这样写代码

#2


引用 1 楼  的回复:
使用对象名吧,get_class($obj),php貌似没有这个方法,当然个人觉得也没必要这样用,楼主是啥情况 要这样写代码


在用一个html的解析类,其中需要针对解析出来的各个节点计算其子节点(包括孙节点)的个数。计算完后要记录到一个以节点为key、子节点个数为value的数组内,以便能够通过节点迅速查到其子节点的个数。

基本就是这个应用,希望记录这么一个表。

想了别的办法,一开始打算用html中的id属性来标识节点,但有些html标记没有id,所以找找有没有别的办法

#3


可以把$obj 转array

#4


如果你想用来当作唯一标识的话


class A
{
    public $a = null;

    public function b()
    {
        echo 'c';
    }
}
$a = new A;


$a = md5(serialize($a));        // <----
// 或者
$a = md5(json_encode($a));      // <----

#5


然后用md5返回的字符串$a来当下标

#6


这个意思?
class tag {
  function __construct() {
    $this->name = get_class($this);
  }
}
class img extends tag {}
class div extends tag {}

$ar[serialize(new div)] = 1;
$ar[serialize(new img)] = 1;

print_r($ar);

foreach($ar as $k=>$v)
  echo unserialize($k)->name, "=> $v", PHP_EOL;
Array
(
    [O:3:"div":1:{s:4:"name";s:3:"div";}] => 1
    [O:3:"img":1:{s:4:"name";s:3:"img";}] => 1
)
div=> 1
img=> 1

#7


我到有个简单的办法

$abc = new ABC();
$array = array();
$array['abc'] = $abc;

6楼的办法是可以实现,但是感觉不是很好,因为如果这个对象的内容很多,那岂不是要消耗很多内存,个人认为,如有不对,还请指教

#8


引用 2 楼  的回复:
引用 1 楼  的回复:

使用对象名吧,get_class($obj),php貌似没有这个方法,当然个人觉得也没必要这样用,楼主是啥情况 要这样写代码


在用一个html的解析类,其中需要针对解析出来的各个节点计算其子节点(包括孙节点)的个数。计算完后要记录到一个以节点为key、子节点个数为value的数组内,以便能够通过节点迅速查到其子节点的个数。

基本就是这个应用,希望记……


解决问题还是根据需求来做比较好, 你这就是想记录一个node => count的关联关系, 很明显不是node name => count这种映射关系, 你也说了你是想让内存地址作key的, 而不是Node名字, 一个Html里相同node name的结点多了去了。

怎么取得一个Node的内存地址就是关键了,序列化/json等等都是一样的,相同内容的Node在处理后还是会冲突的。

这里,个人观点:唯一的是路径,也就是DOM层次路径。
所以,建议是:递归时维护一个路径栈array(push,pop),序列化这个路径array来作为唯一标识。

至于你要查找一个node的count,当然要先计算得到node的路径,这个效率太JB低了,怎么办?
当然是在上面生成关联的递归过程中,将每个NODE的路径存储在NODE的一个属性里了。

#9


用字符串吧。前一个作为键后一个作为值

#10


熟悉spl 开发更轻松.

SPL库中的迭代器接口
SPL提供了6个迭代器接口,如下表
Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口)
Iterator 迭代器接口(可在内部迭代自己的外部迭代器或类的接口)
IteratorAggregate 聚合式迭代器接口(创建外部迭代器的接口)
OuterIterator 迭代器嵌套接口(将一个或多个迭代器包裹在另一个迭代器中)
RecursiveIterator 递归迭代访问接口(提供递归访问功能)
SeekableIterator 可索引迭代访问接口(实现查找功能)

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com