У меня есть метод в классе, который выглядит так:
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. В идеале возвращаемый массив будет в том же порядке, что и ключи, указанные в списке $. Например:
$foo = new SomeClass(); list($foo, $bar, $baz) = $foo->getAsList(array('foo', 'bar', 'baz');
Я могу легко написать некоторый явный, верный PHP-код в цикле, чтобы сделать это, но есть ли какой-нибудь умный способ использовать различные функции массива, например array_multisort (), чтобы выплюнуть это в минимальных строках кода (и, надеюсь, при компилированном коде скорость – я проверю это, если это имеет значение).
В некотором смысле, это мозговой тизер, которому я еще не знаю ответа. Это не критично, я делаю это без явного цикла, но мне любопытно, можно ли это сделать. Я потратил около 30 минут на это и еще не нашел решение.
Возможно, 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 ) */