我在类中有一个看起来像这样的方法;
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代码来执行此操作,但是有一些聪明的方法可以使用各种数组函数,例如: array_multisort()用最少的代码行吐出来(希望在编译的代码速度上 - 我会测试它,如果重要的话)。
从某种意义上说,这是一个脑筋急转弯,我还不知道答案。没有明确的循环我这样做并不重要,但我很好奇它是否可以完成。我花了大约30分钟,还没有找到解决方案。
答案 0 :(得分:8)
也许array_replace是您拼图的缺失部分:
public function getAsList($list = array())
{
$klist = array_flip($list);
return array_values(array_intersect_key(array_replace($klist, $this->hidden), $klist));
}
示例(Demo):
$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
)
*/
答案 1 :(得分:0)
在可读性,可维护性和效率方面,函数编程与语言构造相比显得苍白无力。这是其中一种情况。
我偏向于函数式编程,但是在这种情况下,它是无济于事的。
代码:(Demo)
$hidden = [
'apples' => 19,
'eggs' => 7,
'grapes' => 144,
'mushrooms' => 3,
'oranges' => 16
];
$list = ['grapes', 'apples', 'eggs', 'oranges'];
foreach ($list as $item) {
if (isset($hidden[$item])) {
$result[] = $hidden[$item];
}
}
var_export($result);
输出:
array (
0 => 144,
1 => 19,
2 => 7,
3 => 16,
)
如果您坚持使用函数式编程,那么按以下顺序执行所需的操作将是最有效的:
方法如下:
代码:(Demo)
$flippedList = array_flip($list);
var_export(array_values(array_replace($flippedList, array_intersect_key($hidden, $flippedList))));
(与先前代码段的输出相同)
从逻辑上讲,对其中包含多余元素的数组进行排序没有任何意义。首先减轻负载。