php根据数组中的两个键创建计数

时间:2016-05-31 11:51:50

标签: php arrays

我有一个名为$dinnerDetails的数组,看起来像这样

array:5 [▼
  0 => array:7 [▼
    "request_id" => "48"
    "dinner_id" => "36"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-16T10:00:00"
    "host_id" => "77"
    "new_dinner" => "yes"
    "requestCount" => 3
  ]
  1 => array:7 [▼
    "request_id" => "51"
    "dinner_id" => "36"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-16T10:00:00"
    "host_id" => "77"
    "new_dinner" => "no"
    "requestCount" => 3
  ]
  2 => array:7 [▼
    "request_id" => "65"
    "dinner_id" => "36"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-16T10:00:00"
    "host_id" => null
    "new_dinner" => "no"
    "requestCount" => 3
  ]
  3 => array:7 [▼
    "request_id" => "50"
    "dinner_id" => "35"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-27T10:00:00"
    "host_id" => "77"
    "new_dinner" => "yes"
    "requestCount" => 2
  ]
  4 => & array:7 [▼
    "request_id" => "52"
    "dinner_id" => "35"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-27T10:00:00"
    "host_id" => "77"
    "new_dinner" => "no"
    "requestCount" => 2
  ]
]

您会注意到每个子阵列都有dinner_idhost_id,如果这两个值都存在则表示晚餐已经确认。我想要做的是计算确认的晚餐数量。在dinner_id => 36之上的数组中已经有2个人确认,dinner_id =>也是如此。 35,

我想在子数组中添加一个新的key,让我们调用它confirmationCount并将确认的计数放在它上面,以便我的输出看起来像这样

array:5 [▼
  0 => array:8 [▼
    "request_id" => "48"
    "dinner_id" => "36"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-16T10:00:00"
    "host_id" => "77"
    "new_dinner" => "yes"
    "requestCount" => 3
    "confirmationCount" => 2
  ]
  1 => array:8 [▼
    "request_id" => "51"
    "dinner_id" => "36"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-16T10:00:00"
    "host_id" => "77"
    "new_dinner" => "no"
    "requestCount" => 3
    "confirmationCount" => 2
  ]
  2 => array:8 [▼
    "request_id" => "65"
    "dinner_id" => "36"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-16T10:00:00"
    "host_id" => null
    "new_dinner" => "no"
    "requestCount" => 3
    "confirmationCount" => 2
  ]
  3 => array:8 [▼
    "request_id" => "50"
    "dinner_id" => "35"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-27T10:00:00"
    "host_id" => "77"
    "new_dinner" => "yes"
    "requestCount" => 2
    "confirmationCount" => 2
  ]
  4 => & array:8 [▼
    "request_id" => "52"
    "dinner_id" => "35"
    "dinner_name" => "Black Tie"
    "dinner_date" => "2016-05-27T10:00:00"
    "host_id" => "77"
    "new_dinner" => "no"
    "requestCount" => 2
    "confirmationCount" => 2
  ]
]

为此,我写了foreach循环两次,第一个循环准备数组,第二个循环添加我需要的计数。

$dinnerDetails = array();
$lastDinnerDate = '';
$newDate = '';
$countDinner = array();
$countConfirmation = array();
//Prepare an array of requests so it can be passed back to the controller
foreach ($invitations as $invitation) {

        $countDinner[$invitation['dinner_id']] = isset($countDinner[$invitation['dinner_id']]) ? $countDinner[$invitation['dinner_id']] + 1 : 1;
        $countConfirmation[$invitation['host_id']] = isset($countConfirmation[$invitation['host_id']]) ? $countConfirmation[$invitation['host_id']] + 1 : 1;

        //If the date changes then assign yes, this is used on front end to display date on top of requests
        if (strtotime($invitation['dinner_date']) > $lastDinnerDate) {
            $newDate = 'yes';
        } else {
            $newDate = 'no';
        }

        $lastDinnerDate = strtotime($invitation['dinner_date']);

        $dinnerDetails[] = array(
            'request_id' => $invitation['request_id'],
            'dinner_id' => $invitation['dinner_id'],
            'dinner_name' => $invitation['dinner_name'],
            'dinner_date' => $invitation['dinner_date'],
            'host_id' => $invitation['host_id'],
            'new_dinner' => $newDate,
        );

}

foreach ($dinnerDetails as &$dinnerDetail) {
    $dinnerDetail['requestCount'] = $countDinner[$dinnerDetail['dinner_id']];
    $dinnerDetail['confirmationCount'] = $countConfirmation[$dinnerDetail['host_id']];
}

我遇到的问题是在下面的代码中

$countConfirmation[$invitation['host_id']] = isset($countConfirmation[$invitation['host_id']]) ? $countConfirmation[$invitation['host_id']] + 1 : 1;

我需要更新此代码,以便将dinner_id考虑在内,以便我得到的结果'confirmationCount'与晚餐相关联。现在它会查找host_id并返回结果,无论确认是否与正确的晚餐相关联。

1 个答案:

答案 0 :(得分:0)

此方法基于多维数组。因此,您正在$countConfirmation以[{1}} $countConfirmation[77][36] 77 host_id 36 dinner_id的方式向id=36发送信息。知道按host=77排序$countConfirmation[$invitation['host_id']] = isset($countConfirmation[$invitation['host_id']]) ? $countConfirmation[$invitation['host_id']] + 1 : 1; 的晚餐数量,所以只需将此信息添加到数组中。

快速的方法是改变:

$countConfirmation[$invitation['host_id']][$invitation['dinner_id']] = isset($countConfirmation[$invitation['host_id']][$invitation['dinner_id']]) ? $countConfirmation[$invitation['host_id']][$invitation['dinner_id']] + 1 : 1;

[ "77" : 
    [ 
        "36"  : "2",
        "35"  : "2"
    ],

  "othe_host_id" : 
    [
        "other_dinner_id"  : "count_of_orders",
        "other_dinner_id_2"  : "count_of_orders_2",
    ],  
]

在此更改后,您将收到双范围数组类型:

$dinnerDetail['confirmationCount'] = $countConfirmation[$dinnerDetail['host_id']];

在你的第二个循环而不是:

host_id

通过2个参数检查信息dinner_id$dinnerDetail['confirmationCount'] = $countConfirmation[$dinnerDetail['host_id']][$dinnerDetail['dinner_id']];

ng-model-options="{timezone:'UTC'}"