Intereting Posts
Отслеживание информации из аудиопотока с помощью PHP Добавить пользовательское поле на странице «Информация о заказе» на странице Opencart Вытягивание JSON через AJAX для заполнения Drop-Down HTML – изменение цвета в текстовой области из опции внутри поля выбора, сгенерированного из mysql Пользовательская конечная точка WooCommerce API v3 Regex для проверки даты в PHP с использованием формата в формате ГГГГ-ММ-ДД Изменение ключа массива без изменения порядка Как я могу опубликовать статью на странице Фан-сайта Facebook, используя PHP и Open Graph API Как и где может применяться защита XSS в Laravel? есть способ передать значение на другую страницу? как извлекать данные из необработанного html-файла Vagrant – удаленное подключение к mysql – внешнее соединение брандмауэра ssh Тег <? Неполадка в PHP Что не так в контроллере angularjs Как я могу вызвать функцию в программе на языке C из php?

Сортировка PHP array_intersect_key () результатов по второму массиву

У меня есть метод в классе, который выглядит так:

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 минут на это и еще не нашел решение.

Related of "Сортировка PHP array_intersect_key () результатов по второму массиву"

Возможно, 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 ) */