PHP排序array_intersect_key()由第二个数组生成

CXJ*_*CXJ 11 php sorting

我在类中有一个看起来像这样的方法;

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) );
    }
Run Code Online (Sandbox Code Playgroud)

但这没用,因为该方法的调用者不知道实例变量$ hidden中关联数组中键/元素对的顺序.理想情况下,返回的数组的顺序与$ list中指定的键完全相同.例如:

$foo = new SomeClass();
list($foo, $bar, $baz) = $foo->getAsList(array('foo', 'bar', 'baz');
Run Code Online (Sandbox Code Playgroud)

我可以轻松地在循环中编写一些明确的,冗长的PHP代码来执行此操作,但是有一些聪明的方法可以使用各种数组函数,例如array_multisort()在最小的代码行中吐出来(希望在编译的代码中)速度 - 我会测试它,如果重要的话).

从某种意义上说,这是一个脑筋急转弯,我还不知道答案.没有明确的循环我这样做并不重要,但我很好奇它是否可以完成.我花了大约30分钟,还没有找到解决方案.

Pau*_*aul 11

也许array_replace是您拼图中缺失的部分:

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

示例(演示):

$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
)
*/
Run Code Online (Sandbox Code Playgroud)