0 レビュー
2 回答
php-オブジェクトのループから配列を構築する
現在、laravelアプリケーションに取り組んでおり、データベースからeloquentによって返されるオブジェクトから配列を作成しようとしています。オブジェクトは次のようになります、
[
{
"id": 3,
"body": "Fake User created the project Fake Project 2",
"uri": "8jss90xk",
"object_id": 422,
"user": [
{
"id": 25,
"email": "[email protected]",
"first_name": "xxx1",
"last_name": "xxxx1",
"display_name": "xxxxxxxxxxx",
"initials": "XX",
"remember_me": null,
"active": "1",
"invite_code": null,
"forgotten_code": null,
"cost_visible": 0,
"login_type": "normal",
"api_token": null,
"created_at": "2015-02-13 11:47:24",
"updated_at": "2015-05-06 22:43:23",
"deleted_at": null,
"pivot": {
"notification_id": 3,
"user_id": 25,
"is_read": 0
}
}
],
"project": {
"id": 422,
"name": "Project Number 1",
"slug": "Tdc3de97",
"uri_hash": "project-number-1",
"description": null,
"total_cost": "1000.00",
"start_date": "2015-07-21",
"finish_date": "2015-10-22",
"status": 2,
"sales_person": null,
"client_id": 0,
"organisation_id": 97,
"owner_id": 97,
"user_id": 25,
"locked_by": null,
"created_at": "2015-07-21 13:39:21",
"updated_at": "2015-07-24 10:07:38",
"deleted_at": null,
"archived_at": "0000-00-00 00:00:00",
"invoiced_at": null,
"is_internal": 0
}
},
{
"id": 4,
"body": "Fake User created the project Fake Project 3",
"uri": "8jss90xk",
"object_id": 422,
"user": [
{
"id": 25,
"email": "[email protected]",
"first_name": "XXXXX",
"last_name": "XXXXXXXX",
"display_name": "XXX",
"initials": "XX",
"remember_me": null,
"active": "1",
"invite_code": null,
"forgotten_code": null,
"cost_visible": 0,
"login_type": "normal",
"api_token": null,
"created_at": "2015-02-13 11:47:24",
"updated_at": "2015-05-06 22:43:23",
"deleted_at": null,
"pivot": {
"notification_id": 4,
"user_id": 25,
"is_read": 0
}
}
],
"project": {
"id": 422,
"name": "Project Number 1",
"slug": "Tdc3de97",
"uri_hash": "project-number-1",
"description": null,
"total_cost": "1000.00",
"start_date": "2015-07-21",
"finish_date": "2015-10-22",
"status": 2,
"sales_person": null,
"client_id": 0,
"organisation_id": 97,
"owner_id": 97,
"user_id": 25,
"locked_by": null,
"created_at": "2015-07-21 13:39:21",
"updated_at": "2015-07-24 10:07:38",
"deleted_at": null,
"archived_at": "0000-00-00 00:00:00",
"invoiced_at": null,
"is_internal": 0
}
},
{
"id": 5,
"body": "Fake User created the project Fake Project 4",
"uri": "8jss90xk",
"object_id": 422,
"user": [
{
"id": 25,
"email": "[email protected]",
"first_name": "XXXXXX",
"last_name": "XXXXXXX",
"display_name": "XXXXXXX",
"initials": "XX",
"remember_me": null,
"active": "1",
"invite_code": null,
"forgotten_code": null,
"cost_visible": 0,
"login_type": "normal",
"api_token": null,
"created_at": "2015-02-13 11:47:24",
"updated_at": "2015-05-06 22:43:23",
"deleted_at": null,
"pivot": {
"notification_id": 5,
"user_id": 25,
"is_read": 0
}
}
],
"project": {
"id": 422,
"name": "Project Number 1",
"slug": "Tdc3de97",
"uri_hash": "project-number-1",
"description": null,
"total_cost": "1000.00",
"start_date": "2015-07-21",
"finish_date": "2015-10-22",
"status": 2,
"sales_person": null,
"client_id": 0,
"organisation_id": 97,
"owner_id": 97,
"user_id": 25,
"locked_by": null,
"created_at": "2015-07-21 13:39:21",
"updated_at": "2015-07-24 10:07:38",
"deleted_at": null,
"archived_at": "0000-00-00 00:00:00",
"invoiced_at": null,
"is_internal": 0
}
}
}]
基本的に、クエリは未読の通知を持つすべてのユーザーを返します。これを通知と一緒に配列に組み込み、メールを送信したいのですが、配列には詳細が含まれている必要があります。
リマインダーを送信するメール機能にこのようなものを送信することを想像します
'[email protected]' => array(
'first_name' => 'User',
'last_name' => 'Lastname',
'projects' => array(
'Project Title 1' => array(
'notifications' => array(
[0] => 'Notification 1',
[1] => 'Notification 2',
[2] => 'Notification 3'
)
)
)
)
オブジェクトからこの配列を構築する方法を実際に理解することはできません。現在、コードにこれが含まれています。
foreach($unread as $object) {
$emails_to_send = array(
'user' => $object->user[0],
'uri' => $object->uri,
'body' => $object->body,
'project' => $object->project
);
}
ただし、これにより間違った構造が構築され、最後のループが上書きされます。
わからない
0
レビュー
答え :
解決策:
最後のループでデータが上書きされる理由は、配列に追加するのではなく、新しく作成した配列を $ emails_to_send変数に割り当てるためです。次のことを試してください:
$emails_to_send = array();
foreach($unread as $object) {
$emails_to_send[] = array(
'user' => $object->user[0],
'uri' => $object->uri,
'body' => $object->body,
'project' => $object->project
);
}
var_dump($emails_to_send);
これにより、送信する必要のあるメールごとに1つのエントリを含むリストが表示されます。
わからない
0
レビュー
答え :
解決策:
結果の配列を反復処理する必要があるのは当然ですが、次のようになります:
// First create the final array
$emails_to_send = array();
foreach($unread as $object) {
// Add new array element with the email key
$emails_to_send[$object->user[0]->email] = array(
'first_name' => $object->user[0]->first_name,
'last_name' => $object->user[0]->last_name,
'project' => $object->project
);
}
var_export($emails_to_send);
その結果、次のように表示されます:
array(
'[email protected]' => array(
'first_name' => 'User',
'last_name' => 'Lastname',
'project' => array(
"id" => 422,
"name" => "Project Number 1",
"slug" => "Tdc3de97",
"uri_hash" => "project-number-1",
...
)
),
...
)
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。