どうしたらいいですか?
今回はこんな疑問に答えていきます。
PHPのforeachで1つ前の要素と比較する方法【コードで解説】
今回は、次のような配列を想定します。
$datas = [
0 => [
"target_name" => "諭吉",
"id" => 1,
"content" => "相談があります",
"created_at" => "1000-01-01 01:23:00"
],
1 => [
"target_name" => "諭吉",
"id" => 2,
"content" => "聞いてください",
"created_at" => "1000-01-02 01:25:00"
]
];
この配列をforeachで回しつつ、「1つ前の要素より、created_atが大きかったら〜」という処理を書いていきます。
実際のコード①key-1を使うバージョン
次のようなコードになります。
$beforeDate = date('Y/m/d', strtotime('9999-12-31 23:59:59'));
foreach ($datas as $key => $data) {
$thisDate = date('Y/m/d', strtotime($datas[$key]['created_at']));
if ($key >= 1) {
$beforeDate = date('Y/m/d', strtotime($datas[$key - 1]['created_at']));
}
if ($thisDate > $beforeDate) {
//ここにしたい処理
}
}
配列のキーが1以上の時、[$key - 1]の要素にアクセスすることで、比較しています。
何をやっているのか、直感的にわかりやすいので、通常はこちらの記述でいいかなと思います。
実際のコード②prev()を使うバージョン
次のようなコードになります。
$datas = [
0 => [
"target_name" => "諭吉",
"id" => 1,
"content" => "相談があります",
"created_at" => "1000-01-01 01:23:00"
],
1 => [
"target_name" => "諭吉",
"id" => 2,
"content" => "聞いてください",
"created_at" => "1000-01-01 01:25:00"
],
2 => [
"target_name" => "諭吉",
"id" => 3,
"content" => "失恋しました",
"created_at" => "1000-01-03 01:25:00"
]
];
$beforeDate = date('Y/m/d', strtotime('9999-12-31 23:59:59'));
foreach ($datas as $key => $data) {
$thisDate = date('Y/m/d', strtotime($datas[$key]['created_at']));
if ($key >= 1) {
$beforeDate = date('Y/m/d', strtotime(prev($datas)['created_at']));
}
if ($thisDate > $beforeDate) {
//ここにしたい処理
}
next($datas);
}
実は、phpには「prev()」という、1つ前の配列の要素にアクセスするための関数が用意されています。
そちらを使うのもアリでしょう。
PHPに慣れているからすると、こちらのほうがスマートかなとも思います。
注意点は、foreachの1回1回の最後に、next()でポインタを進めている点です。
このコードがないと、ポインタが進まないので注意です。
ということで、今回はPHPで配列をforeachで回す際に、1つ前の要素にアクセスする方法を紹介しました。
自分の場合は、チャットアプリで送信日が変わった時に表示するために使いました。
この記事が参考になれば幸いです。
最後まで読んでいただきありがとうございました。