У меня есть класс, который возвращает комнаты. У меня есть пара методов (4-5), которые все извлекают «доступные» параметры, которые пользователь может указать этому API для возврата уникальных результатов.
В одном из этих методов я проверяю, действительно ли предоставленная пользователем строка «зданий» действительно соответствует «действительным» зданиям. Для этого в данный момент я делаю:
$buildings = $this->_getBuildings();
$buildingIds = array();
foreach ( $buildings as $building ) {
$buildingIds[] = $building['id'];
}
$valid = true;
foreach ( $userPassedBuildingValues as $value ) {
if ( !in_array( $value, $buildingIds ) ) {
$valid = false;
$this->addError();
}
}
Я ищу способ реорганизовать это, чтобы мне не пришлось циклически перебирать все строительные элементы и создавать новый массив каждый раз, когда я делаю это сравнение. Существуют ли функции отображения / поиска в массивах, которые могут сделать это проще?
Я обдумывал рефакторинг getBuildings
иметь необязательный аргумент для возврата списка идентификаторов, но это «изводит» функцию, и я не думаю, что она будет такой же «чистой», как сейчас.
РЕДАКТИРОВАТЬ # 1Первой идеей было создать метод, который бы брал ключ и возвращал объединенный массив этих ключей из массива. Например,
$buildings = $this->_getBuildings();
$buildingIds = $this->_getAllValues( 'id', $buildings );
function _getAllValues( $key, $array ) {
$return = array();
foreach ( $array as $rowKey => $row ) {
if ( $rowKey == $key )
$return[] = $row[$key]
}
return $return;
}
Но, возможно, есть другой, более чистый подход? Я бы делал то же самое для 4-5 разных функций.
Примечание. Глубина массивов будет не более одного, поэтому не нужно беспокоиться о глубоко вложенных массивах.
Ты можешь использовать узо-лакомство лайк:
$buildingIds = Arrays::map($buildings, Functions::extract()->id);
Вот ссылки: Функции :: экстракт, Массивы :: Карта.
//РЕДАКТИРОВАТЬ
Вот два класса, которые можно использовать в качестве помощника.
class Helper
{
public static function getBuldingIds($buildings)
{
return Arrays::map($buildings, Functions::extract()->id);
}
}
class Helper
{
public static function getBuldingIds($buildings)
{
return array_map(function($building){
return $building['id'];
}, $buildings);
}
}
Других решений пока нет …