2012-02-22 9 views
0

私はキーが文字列のペアであるPHPで連想配列を作りたいと思います。phpはC++のstd :: pairを持っていますか?

最初は、文字列を途中で一意の仕切りを使用して連結し、後で分割することを検討していましたが、これはペアを使用するためのハックリな回避策のようです。あなたがPHPで配列のキーとして配列を使用することはできませんので

$andrew = array('Andrew', 'Rasmussen'); 
$john = array('John', 'Smith'); 
$container[$andrew] = 15; 
$container[$john] = 12; 

$pair = array('Andrew', 'Rasmussen'); 
if (array_key_exists($pair, $container)) { 
    echo 'true'; 
} else { 
    echo 'false'; 
} 

明らかにこのコードは動作しません。

は、次のコードを考えてみましょう。 いいえこれを連結せずに後で解析する方法がありますか?

編集

私はこれをやりたいと思った理由を持っています。私はarray(key=string1,value=array(key=string2,value=occurrences))を持っていて、私は文字列ペアの上位5(出現の点で)を見つけようとしています。だから私は基本的に1次元配列にこれを平坦化しようとしているし、それを並べ替えるので、私は簡単にトップ5をつかむことができます。しかし、これを行うには、ソートした後に別にストリングを抽出する必要があります。上記で説明した除算アルゴリズムを使用して行うことができますが、これは好ましくありません。そのため、代替手段を求めています。

+0

可能ですか?はい、しかし、それはちょうど連結を使用し、 '爆発 'よりもはるかに多くの仕事のようです。 – paxdiablo

+0

@paxdiabloあなたはconcat + explodeとserialize()+ unserialize()の配列についてどう思いますか? –

+0

私はあなたが任意のセパレータを発明する必要がないので、直列化がより良いと思われます。 – paxdiablo

答えて

2

方法についてserializeキー?

$pair = array('Andrew', 'Rasmussen'); 
if (array_key_exists(serialize($pair), $container)) { 
    echo 'true'; 
} else { 
    echo 'false'; 
} 
+0

デシリアライズできますか? –

+0

シリアル化されていないようです。私はまだこれがもっともエレガントな方法だとは思わないが、間違いなく簡単だ!ありがとう。 –

+0

はい、シリアル化を解除することができます! – nickb

1

多次元配列を使用することができます(例:$container["Andrew"]["Rasmussen"])。

また、あなたはカプセル化することができ、すべての「ハッキング」(もそれ配列や文字列の連結二次元)は、次のようなことができたカスタムArrayIndexedByPairsクラス、中:INGの

interface IArrayIndexedByPairs { 
    public Add($key1, $key2, $value); 
    public Contains($key1, $key2); 
    public Get($key1, $key2); 
} 
関連する問題