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