Как я могу реорганизовать этот код, который проверяет, находятся ли несколько значений массива внутри другого ключа конкретного массива?

У меня есть класс, который возвращает комнаты. У меня есть пара методов (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 разных функций.

Примечание. Глубина массивов будет не более одного, поэтому не нужно беспокоиться о глубоко вложенных массивах.

1

Решение

Ты можешь использовать узо-лакомство лайк:

$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);
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]