Рассчитать количество элементов по конкретным критериям - PullRequest
0 голосов
/ 12 июня 2018

У меня есть массив типа

array(3) { 
  [0]=> array(2) { 
    ["AllotmentId"]=> string(36) "6b594c22-73f1-0a2a-298c-2d3feba2905d" 
    ["RoomId"]=> string(36) "9a21e427-16fd-7a9e-bc16-537dc55093bb" } 
  [1]=> array(2) { 
    ["AllotmentId"]=> string(36) "99730f9a-2242-24bd-0908-b9035a75d328" 
    ["RoomId"]=> string(36) "9a21e427-16fd-7a9e-bc16-537dc55093bb" } 
  [2]=> array(2) { 
    ["AllotmentId"]=> string(36) "fft54c22-73f1-0a2a-2558c-2d3fgged" 
    ["RoomId"]=> string(36) "663ghjytf-16fd-7a9e-bc16-537dc55r5g0" } 
}

Теперь я хочу создать еще один массив, в котором будет храниться следующая информация, такая как

[ 
  RoomId => "9a21e427-16fd-7a9e-bc16-537dc55093bb",  NumberOfAllotments => 2 
  RoomId => "663ghjytf-16fd-7a9e-bc16-537dc55r5g0",  NumberOfAllotments => 1
]

. Она должна рассчитывать количество идентификаторов выделения для комнатыидентификаторы и создать еще один массив.

Я не могу настроить следующие строки кода.

foreach ($allotmentArray as $key => $allotment) 
{          
    $arrayToPush = array('RoomId' => $allotment["RoomId"], "NumberOfAllotments" => $count]);
    array_push($freeRooms, $arrayToPush); 
}

Пожалуйста, помогите !!!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Попробуйте это:

// Your array
$array = array(
  0 => array(
    "AllotmentId" => "6b594c22-73f1-0a2a-298c-2d3feba2905d",
    "RoomId" => "9a21e427-16fd-7a9e-bc16-537dc55093bb" ),
  1=> array(
    "AllotmentId"=> "99730f9a-2242-24bd-0908-b9035a75d328",
    "RoomId" => "9a21e427-16fd-7a9e-bc16-537dc55093bb" ),
  2=> array(
    "AllotmentId"=> "fft54c22-73f1-0a2a-2558c-2d3fgged",
    "RoomId"=> "663ghjytf-16fd-7a9e-bc16-537dc55r5g0" )
);

1 / Я создаю временный массив

$temp_array = array();

2 / Затем я добавляю все значение roomId в этот временный массив

foreach ($array as $key => $data) {
    $temp_array[] = $data['RoomId'];
}

3 / Теперь я подсчитываю номер каждого roomId

$temp_result = array_count_values($temp_array);

Здесь вывод:

array (size=2)
  '9a21e427-16fd-7a9e-bc16-537dc55093bb' => int 2
  '663ghjytf-16fd-7a9e-bc16-537dc55r5g0' => int 1

4 / Теперь я создам свой массив результатов

$result = array();

5 / Я добавляю новый массив с roomId и количеством выделений

foreach ($temp_result as $roomId => $NumberOfAllotments) {
    $result[] = array(
        'RoomId' => $roomId,
        'NumberOfAllotments' => $NumberOfAllotments
    );
}

Вот вывод:

array (size=2)
  0 => 
    array (size=2)
      'RoomId' => string '9a21e427-16fd-7a9e-bc16-537dc55093bb' (length=36)
      'NumberOfAllotments' => int 2
  1 => 
    array (size=2)
      'RoomId' => string '663ghjytf-16fd-7a9e-bc16-537dc55r5g0' (length=36)
      'NumberOfAllotments' => int 1

Это то, что вы ищете?

Я думаю, вы можете найти другой способ, используя некоторую функцию массива php, но этот метод работает (если я понимаю, что вы хотели!)

0 голосов
/ 12 июня 2018

Насколько я понимаю, вам не нужно зацикливаться.
Используйте array_column и array_count_values.

$Roomid = array_count_values(array_column($arr, "RoomId"));

Теперь ключ Roomid - это Roomid, а значение - это счетчик каждого.

Если вам нужен массив, как в вашем вопросе, вы можете сделать так:

$Roomid = array_count_values(array_column($arr, "RoomId"));
Foreach($Roomid as $room => $count){
    $arr[] = ["Roomid" => $room, 'NumberOfAllotments' => $count];
}

Это зациклит только каждую уникальную комнату, а не полный массив.

Выходные данные:
https://3v4l.org/ohUJS

0 голосов
/ 12 июня 2018

попробуйте этот код:

сначала посчитайте и сохраните в массиве значений ключей с именем $ targetArray.затем сгенерируйте предпочитаемый вывод в $ outputArray:

<?php

$targetArray = array();

foreach ($allotmentArray as $allotment) 
{
    if(!array_key_exists($allotment['RoomId'], $targetArray))
        $targetArray[$allotment['RoomId']] = 0;
    $targetArray[$allotment['RoomId']]++;
}

$outputArray = array();

foreach($targetArray as $RoomId=> $count)
    $outputArray[] = array('RoomId'=>,'count'=>$count);

var_dump($outputArray);
...