12

クラスに次のようなメソッドがあります。

class SomeClass {
    private $hidden = array(....);

    /**
     * @return array - numeric indexed array in order of $this->hidden.
     * Suitable for use by list(var1, var2, ...)
     */
    public function getAsList($list = array())
    {
       return array_values(array_intersect_key($this->hidden, array_flip($list) );
    }

しかし、メソッドの呼び出し元は、インスタンス変数 $hidden の連想配列内のキーと要素のペアの順序を知らないため、これは役に立ちません。理想的には、返される配列は、$list で指定されたキーとまったく同じ順序になります。例えば:

$foo = new SomeClass();
list($foo, $bar, $baz) = $foo->getAsList(array('foo', 'bar', 'baz');

これを行うために、明示的で冗長なPHPコードをループで簡単に書くことができますが、さまざまな配列関数を使用する賢い方法がありますか?速度 -- 問題があればテストします)。

ある意味、これはまだ答えがわからない頭の体操です。明示的なループなしで実行することは重要ではありませんが、実行できるかどうかは興味があります。私はそれに30分ほど費やしましたが、まだ解決策を見つけていません。

4

2 に答える 2

16

おそらく、 array_replaceがパズルの欠けているピースです。

public function getAsList($list = array())
{
  $klist = array_flip($list);
  return array_values(array_intersect_key(array_replace($klist, $this->hidden), $klist));
}

例 (デモ):

$hidden = [
  'apples' => 19,
  'eggs' => 7,
  'grapes' => 144,
  'mushrooms' => 3,
  'oranges' => 16
];

$list = ['grapes', 'apples', 'eggs', 'oranges'];

$klist = array_flip($list);
print_r(array_values(array_intersect_key(array_replace($klist, $hidden), $klist)));

/*
Array
(
    [0] => 144
    [1] => 19
    [2] => 7
    [3] => 16
)
*/
于 2013-07-03T01:09:20.090 に答える