PHP stdClass и объекты foreach - PullRequest
0 голосов
/ 09 июля 2020

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

    $filter = new \stdClass();

    $queryObj = $this->getpost['filter'];

    $filters = new \stdClass();
    $filters->team = $queryObj['team'];
    $filters->skill = $queryObj['skill'];
    $filters->division = $queryObj['division'];

    $filter->filters = $filters;
    $users = $managerStatistics->getManagerDeliveryData($filter);

Я почувствовал необходимость сделать это, потому что в getManagerDeliveryData (§filter) есть «foreach $ filter-> filters. "..

Кто-нибудь знает, как это сделать лучше? Мне это кажется беспорядочным, но я не уверен, что здесь делать ..

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Вы можете переписать способ построения данных в более компактном формате, преобразовывая каждое определение массива в объект по мере необходимости ...

$filter = (object) [
        "filters" => (object) [ 'team' => $queryObj['team'], 
                'skill' => $queryObj['skill'], 
                'division' => $queryObj['division'] ]
];
0 голосов
/ 09 июля 2020

Если вы приведете ассоциативный массив к объекту, он станет объектом stdClass с соответствующими свойствами. Вот общий пример c:

$arr = ['one' => 'foo', 'two' => 'bar', 'three' => 'meh']; 
$obj = (object) $arr;   

var_dump($obj);

Это даст вам:

object(stdClass)#2 (3) {
    ["one"] · string(3) "foo"
    ["two"] · string(3) "bar"
    ["three"] · string(3) "meh"
}

В вашем случае вы могли бы сделать следующее, если надеетесь, что вам не придется назовите свои $queryObj ключи / значения один за другим (что необходимо, если, например, список фильтров не фиксирован и, следовательно, не может быть жестко запрограммирован):

$filters = (object) $queryObj;

Очевидно, каждая пара ключ / значение в исходном массиве становится парой свойство / значение в объекте. Если есть определенные значения, которые вы хотите опустить, либо отключите их, либо используйте array_intersect_key() et c. функции, чтобы использовать только желаемые клавиши. Предположим, ваш $queryObject имеет несколько ключей, но вам нужны только те, которые указаны в вашем примере, вы можете сделать это:

$keymap = ['team', 'skill', 'division'];
$filters = (object) array_intersect_key(array_flip($keymap), $queryObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...