前提・実現したいこと
いつも大変お世話になっております。
DBから引っ張ってきた下記の二次元配列の中から
①statusが4で
②かつkindが重複しているものがあれば、
③updateが古いほう(より過去のもの)のstatusおよびflagだけを0にする
ということをやりたいのですが、
途中から行き詰ってしまって…皆さまのお力添えをいただきたいです。
PHP
1<?php 2$list = Array ( 3 [0] => Array ( [no] => 8 [kind] => 5 [flag] => 1 [status] => 4 [update] => 2014-08-20 ), 4 [1] => Array ( [no] => 15 [kind] => 3 [flag] => 0 [status] => 3 [update] => 2016-12-25 ), 5 [2] => Array ( [no] => 22 [kind] => 6 [flag] => 1 [status] => 4 [update] => 2017-03-01 ), 6 [3] => Array ( [no] => 48 [kind] => 9 [flag] => 1 [status] => 4 [update] => 2018-05-22 ), 7 [4] => Array ( [no] => 52 [kind] => 5 [flag] => 1 [status] => 4 [update] => 2014-03-04 ), 8 [5] => Array ( [no] => 55 [kind] => 23 [flag] => 1 [status] => 4 [update] => 2015-09-28 ), 9 [6] => Array ( [no] => 104 [kind] => 2 [flag] => 0 [status] => 3 [update] => 2018-11-11 ), 10 [7] => Array ( [no] => 107 [kind] => 3 [flag] => 1 [status] => 4 [update] => 2015-04-28 ), 11 [8] => Array ( [no] => 109 [kind] => 1 [flag] => 0 [status] => 3 [update] => 2016-10-15 ), 12 [9] => Array ( [no] => 116 [kind] => 23 [flag] => 1 [status] => 4 [update] => 2018-07-10 ), 13 [10] => Array ( [no] => 131 [kind] => 11 [flag] => 0 [status] => 3 [update] => 2013-01-02 ), 14); 15?>
テーブル定義は以下のようになってます。
SQL
1CREATE TABLE TableName( 2no int(11) unsigned auto_increment, 3kind tinyint(3) unsigned, 4flag tinyint(4), 5status tinyint(4) DEFAULT 0, 6update date, 7primary key (no) 8);
試したこと
まずループでstatusが4のものを抽出して、
そのうえでkindが重複しているものを抽出し、
updateが古いほうのstatusとactiveFlagを書き換える。
という手順がいいかと考えて、下記までは書いたのですが、
【kindが重複しているものをさらに抽出してそのうちupdateが古いほうを】
というのをどうすればいいか、どうにも思い浮かばない状態です。
PHP
1<?php 2 3$sql = "SELECT * from TableName where status='3' OR status='4'"; 4$rs = mysqli_query($link,$sql); 5$count=0; 6while($row = mysqli_fetch_assoc($rs)){ 7 $Array[$count]["no"] = $row["no"]; 8 $Array[$count]["kind"] = $row["kind"]; 9 $Array[$count]["flag"] = $row["flag"]; 10 $Array[$count]["status"] = $row["status"]; 11 $Array[$count]["update"] = $row["update"]; 12 $count++; 13} 14 15foreach ($Array as $val) { 16 if ($val['status'] == '4') { 17 //ここでkindの重複および日付の判定をしたい 18 $val['status'] = 0; 19 $val['activeFlag'] = 0; 20 } 21} 22?>
DBからstatus3と4を取得しているのは他の処理でも3のレコードが必要なためです。
そもそもこの取得を一度にやろうとせず、もうちょっと考えるべきでしょうか。
間違っていたり、もっと効率的な方法がありましたら
ご指摘頂戴できれば大変助かります。
補足情報(FW/ツールのバージョンなど)
所謂レガシーシステムを扱っておりまして、
PHP環境は5.3になります。
array_columnなどが使えない状態です。
回答2件
あなたの回答
tips
プレビュー