PHP - Вложение массива из ответа API obj

У меня есть ответ API большого объекта, я пытаюсь загрузить данные во вложенный массив, чтобы потом с ним можно было работать. Вот образец объекта, который я получил от API.

SObject Object
(
    [type] => AggregateResult
    [fields] => stdClass Object
        (
            [expr0] => 12
            [Name] => Performance Reviews
            [Status] => Closed - Approved
            [expr1] => 30
        )

)
SObject Object
(
    [type] => AggregateResult
    [fields] => stdClass Object
        (
            [expr0] => 12
            [Name] => Performance Reviews
            [Status] => Closed - Attempted
            [expr1] => 11
        )

)
SObject Object
(
    [type] => AggregateResult
    [fields] => stdClass Object
        (
            [expr0] => 12
            [Name] => Performance Reviews
            [Status] => Closed - Contact Declined
            [expr1] => 13
        )

Как я уже сказал, цель состоит в том, чтобы иметь вложенный массив, который выглядел бы примерно так:

Array
    (
        [January] => Array
        (
            [0] => Array
            (
                [0] => January
                [1] => Closed - Approved
                [2] => 28
            )
            [1] => Array
            (
                [0] => January
                [1] => Closed - Approved
                [2] => 28
            )
        )
    )

Вот мой код:

$query = 
     "SELECT CALENDAR_MONTH(closedDate), recordType.name,status,count(id) 
      FROM case 
      WHERE owner.name ='" . $SFName . "' AND recordType.name IN('DT Case','Performance Reviews') AND closedDate = LAST_N_MONTHS:6 
      GROUP BY CALENDAR_MONTH(closedDate),recordType.Name,status ORDER BY CALENDAR_MONTH(closedDate)";

    $counter     = 0;
    $mprArray    = array(); //instantiate our Array
    $response    = $mySforceConnection->query($query); 
    $queryResult = new QueryResult($response); 

    foreach ($queryResult->records as $case) { 
        //turn our query Result into an Obj
        $sObject    = new SObject($case);
        $recordType = $sObject->Name; 
        $status     = $sObject->Status;
        $month      = $sObject->expr0;
        $count      = $sObject->expr1;

        //this is a filter to weed out a portion of the cases.
        if ($recordType == "Performance Reviews") {
            foreach($sObject as $record) { 
                //change the month's number to a month's name
                $dateObj   = DateTime::createFromFormat('!m', $month);
                $monthName = $dateObj->format('F');
                // Create the nested array, it should end up looking like $mprArray[January]. 
                // This is a dynamic name since we're creating an array for each status that exists in performance Reviews
                $mprArray[$monthName] = array($monthName,$status,$count); 
                // Trying to append our nested array onto the $mprArray so we can work with it later.
                array_push($mprArray,$mprArray[$monthName]);
            }

        }
        //increase counter
        $counter = $counter++; 
    }

} catch (Exception $e) {
    print_r($mySforceConnection->getLastRequest());
    echo $e->faultstring;
}

Вместо вложенного массива только первый элемент в массиве имеет имя «Январь», остальные - на основе счетчика, пока мы не перейдем к следующему месяцу «февраль», вот как это выглядит.

Array
(
    [January] => Array
        (
            [0] => January
            [1] => Closed - Contact Declined
            [2] => 15
        )

    [0] => Array
        (
            [0] => January
            [1] => Closed - Approved
            [2] => 28
        )
)

потому что array_push вставляет данные только в следующий индекс; Я считаю, что вам следует использовать только $mprArray[$monthName][] = array($monthName,$status,$count);; и нет необходимости в array_push после этого

zedling 14.05.2018 17:36

Ух ты. Это сработало отлично. Вы можете мне объяснить, что делает пробел [] в вашем ответе? Это позволяет ему правильно заполнить следующий индекс?

StavenCross 14.05.2018 17:46

это сокращение от array_push; поэтому $mprArray[$monthName][] = $something эквивалентен array_push($mprArray[$monthName], $something); ваша ошибка была следующей строкой, которая испортила исходный массив

zedling 15.05.2018 10:03

Большое спасибо за Вашу помощь!

StavenCross 15.05.2018 13:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
30
1

Ответы 1

потому что array_push вставляет данные только в следующий индекс; Я считаю, что вам следует использовать только $mprArray[$monthName][] = array($monthName,$status,$count);; и нет необходимости в array_push после этого

Другие вопросы по теме