Как я могу построить объект / массив? - PullRequest
0 голосов
/ 06 августа 2020

Я новичок в PHP, поэтому не знаю, как работать с этими наборами данных. Я делаю выбор MySQL и возвращаю объект вроде этого:

{
  "membername": "NAME",
  "bookingdate": "2020-02-03",
  "categoryid": 1,
  "dailyworkhourssum": "7.70"
},
{
  "membername": "NAME",
  "bookingdate": "2020-02-03",
  "categoryid": 3,
  "dailyworkhourssum": "1.2"
},
{
  "membername": "NAME",
  "bookingdate": "2020-02-05",
  "categoryid": 3,
  "dailyworkhourssum": "7.70"
},

Я хочу повторить это, и в итоге он должен выглядеть так:

{
      "membername": "NAME",
      "bookingdate": "2020-02-03",
      "categoryid1": true,
      "categorid3": true,
      "dailyworkhourssum1": "7.70",
      "dailyworkhourssum3": "1.2"
    },
    {
      "membername": "NAME",
      "bookingdate": "2020-02-05",
      "categoryid": 3,
      "dailyworkhourssum": "7.70"
    },

What это означает, что он объединяет два поля вместе (если они имеют одинаковые bookingdate) в одно, так что я могу отображать его в таблице без повторения дат. Моя проблема:

  1. Я не знаю, как называется этот тип данных.
  2. Я не знаю, как создать что-то подобное.

Я могу добавить поля к этому типу данных с помощью $data->newField = example, поэтому я думаю, что это объект.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Если я правильно понял, вы получаете таблицу с 4 столбцами и переменным количеством строк, и вы хотите преобразовать ее в таблицу с переменным количеством столбцов. Для этого использование структуры данных, в которой каждый элемент отличается от предыдущего, может сделать все сложнее, чем нужно. Я предлагаю вам использовать фиксированную структуру:

// I'm assuming you have a PHP array as starting point
$input = [
    [
        'membername' => 'NAME',
        'bookingdate' => '2020-02-03',
        'categoryid' => 1,
        'dailyworkhourssum' => '7.70',
    ],
    [
        'membername' => 'NAME',
        'bookingdate' => '2020-02-03',
        'categoryid' => 3,
        'dailyworkhourssum' => '1.2',
    ],
    [
       'membername' => 'NAME',
       'bookingdate' => '2020-02-05',
       'categoryid' => 3,
       'dailyworkhourssum' => '7.70',
    ],
];

$output = [];
foreach ($input as $data) {
    // We'll group by booking date
    if (!isset($output[$data['bookingdate']])) {
        $output[$data['bookingdate']] = [
            'membername' => $data['membername'],
            'bookingdate' => $data['bookingdate'],
            'categoryid' => $data['categoryid'],
            'dailyworkhourssum' => [],
        ];
    }
    // A single date may have several daily work hours
    $output[$data['bookingdate']]['dailyworkhourssum'][] = $data['dailyworkhourssum'];
}

// We discard array keys (we only needed them to group)
echo json_encode(array_values($output));
[{
    "membername": "NAME",
    "bookingdate": "2020-02-03",
    "categoryid": 1,
    "dailyworkhourssum": ["7.70", "1.2"]
}, {
    "membername": "NAME",
    "bookingdate": "2020-02-05",
    "categoryid": 3,
    "dailyworkhourssum": ["7.70"]
}]

Где бы вы ни потребляли этот JSON, вам просто нужно l oop массив dailyworkhourssum. Вы также можете захотеть l oop всю структуру перед печатью таблицы и сохранить счетчик, чтобы определить максимальное количество столбцов, чтобы вы могли рисовать пустые ячейки там, где это необходимо (таблицы прямоугольные angular).

0 голосов
/ 06 августа 2020

В JS он называется объектом, но в PHP вместо этого вы будете использовать ассоциативный массив. В вашем случае, я думаю, у вас есть массив ассоциативных массивов. Это выглядит так:

    $books = [
     [
       "membername" => "NAME",
       "bookingdate" => "2020-02-03",
       "categoryid" => 1,
       "dailyworkhourssum" => "7.70"
     ],
     [
       "membername" => "NAME",
       "bookingdate" => "2020-02-03",
       "categoryid" => 3,
       "dailyworkhourssum" => "1.2"
     ],
     [
       "membername" => "NAME",
       "bookingdate" => "2020-02-05",
       "categoryid" => 3,
       "dailyworkhourssum" => "7.70"
     ]
   ];

Если вы хотите объединить массивы с одной и той же «датой бронирования», то я рекомендую вам выполнить l oop через этот массив и добавить его элементы в другой ассоциативный массив с датами бронирования в качестве ключей. , и проверьте, если такой ключ уже есть, затем объедините массивы, например:

$merged = [];
foreach ($books as $book) {
    $date = $book['bookingdate'];
    if (isset($merged[$date])) {
        $merged[$date] = $merged[$date] + $book;
    } else {
        $merged[$date] = $book;
    }
}

Я думаю, что это неверный код (нет времени, извините), но я надеюсь, вы подхватываете идею.

Если вам нужен «список» вместо ассоциативного массива, вы можете сделать это:

 $mergedList = array_values($merged);

Таким образом вы избавитесь от строковых ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...