teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

「試したこと」を追加しました。

2020/11/09 04:18

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -207,8 +207,9 @@
207
207
 
208
208
  - (1)の部分を```foreach文```を使って、```$resMrows```の抽出処理をループさせてみましたが、うまく動作しませんでした。
209
209
  ```php
210
- foreach($cLrows as $value){
210
+ foreach($cLrows as $rows){
211
+ foreach($rows as $data){
211
- $ss = $value;
212
+ $ss = $data;
212
213
 
213
214
  中略
214
215
 
@@ -219,5 +220,8 @@
219
220
      'YYpz' => $gtYYpz
220
221
  );
221
222
  }
223
+ }
224
+ ```
225
+ - ```$ss```の値を、```foreach文```を使用せず、”1206(基準値)”を設定すると、会員番号1206の集計結果がきちんと表示されます。ただし、ループ処理を行っていないため、単一の会員番号の集計結果のみしか集計できません。
222
226
 
223
- ```
227
+ - phpなどのリファレンスを読んだり、「PHP 2次元配列」で検索してヒットした記事などを読みあさりましたが、解決できませんでした。

1

質問内容を最小限にとどめ、現時点でのソースコードを追記しました。

2020/11/09 04:18

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -4,14 +4,11 @@
4
4
  基本となるテーブルの構成は、該当のソースコードの通りです。
5
5
 
6
6
  やりたいことは次の通りです。
7
- 0. **『会員番号だけのリスト(```$pLrows```)』**の会員番号の分だけ『集計結果』のループ処理(```$resMrows[会員番号]```)をできるようにしたい。
7
+ 0. **『会員番号だけのリスト(```$pLrows```)』**の会員番号の分だけ『集計結果』のループ処理(```$resMrows```)をできるようにしたい。
8
- 0. 『会員名簿リスト(```$cLrows[$gtNum]```)』『会員番号+集計結果(```$resMrows[会員番号]```)』を、SQL文で例えるなら『LEFT JOIN cLrows.会員番号 = resMrows.会員番号』のようにしたい。(例:会員番号|所属|氏名|役職|MMpt|MMpz|YYpt|YYpz)
9
- 0. 配列の並び替えをし、「YYptの値に対し降順(値が大きい順)」にしたい。
10
- 0. 並び替えができたら、上位5件をピックアップしたい。(ランキング上位5名を抽出)
11
8
 
9
+ 【希望とする配列要素】
10
+ 初期ブログから抽出した会員番号リスト|$gtMMpt|$gtMMpz|$gtYYpt|$gtYYpz
12
11
 
13
-
14
-
15
12
  ### サーバー仕様
16
13
  [ O S ] Windows 10
17
14
  [Server] XAMPP 7.3.22
@@ -21,72 +18,191 @@
21
18
 
22
19
  ### 該当のソースコード
23
20
 
24
-
25
- **【メインとなる『会員名簿』デ取得】**
21
+ 現状のソスコードを、次通り、ご報告します。
26
22
  ```wordpress
27
- (コード)
23
+ <?php
28
- $cLrows[$gtNum] = array(
24
+
29
-     'class' => $gtClass,
30
-     'name' => $gtName,
31
-     'pos' => $gtPost
25
+ // 期間設定の読込
26
+ $Mstart = do_shortcode( '[vMstart]' ); // 月間開始日
27
+ $Mend = do_shortcode( '[vMend]' ); // 月間終了日
28
+ $Ystart = do_shortcode( '[vYstart]' ); // 年間開始日
29
+ $Yend = do_shortcode( '[vYend]' ); // 年間終了日
30
+
32
- );
31
+ ?>
33
32
 
34
- (実行結果)
35
- Array
36
- (
37
-     [会員番号] => Array
38
-       (
39
-       [class] => 所属
40
-       [name] => 氏
41
-       [pos] => 役職
42
- )
43
-
44
- 省略
45
-
46
- ```
47
- 【『会員番号だけ』のデータの取得】
48
- ```Wordpress
49
- (コード)
50
-     $pLrows[] = array(
51
-       'num' => $gtNum
52
- );
33
+ <?php
34
+
35
+ // ------------------------------
36
+ // 会員名簿データからデータ抽出
37
+ // ------------------------------
38
+
39
+ // 会員簿データのページID
40
+ $pid = '6085';
41
+
42
+ // 配列の初期化
43
+ $cLrows = [];
44
+ $pLrows = [];
45
+
46
+ // メインBLOG(blogID:1)データへ切替
47
+ if (get_current_blog_id() != 1) {
48
+ switch_to_blog(1);
49
+ }
50
+
51
+ // 会員名簿の読込&配列
52
+ if ( have_rows( 'list' , $pid ) ) :
53
+ while ( have_rows( 'list' , $pid ) ) : the_row();
54
+ $gtNum = get_sub_field( 'num' , $pid );
55
+ $gtClass = get_sub_field( 'class' , $pid );
56
+ $gtName = get_sub_field( 'name' , $pid );
57
+ $gtPos = get_sub_field( 'pos' , $pid );
58
+
59
+ // PHASE01:会員名簿リスト
60
+ $cLrows[$gtNum] = array(
61
+ 'class' => $gtClass,
62
+ 'name' => $gtName,
63
+ 'pos' => $gtPost
64
+ );
65
+
66
+ // PHASE02会員番号リスト
67
+ $pLrows[] = array(
68
+ 'num' => $gtNum
69
+ );
70
+ endwhile;
71
+ endif;
72
+
73
+ //カスタムクエリをリセット
74
+ wp_reset_postdata();
75
+ ?>
76
+ <?php
77
+
78
+ // 集計用BLOG(blogID:18)データへ切替
79
+ if (get_current_blog_id() != 18) {
80
+ switch_to_blog(18);
81
+ }
82
+ ?>
83
+ <?php
84
+
85
+ // 会員番号リストのループ処理
86
+ foreach( $pLrows as $rows ){
87
+
88
+ foreach( $rows as $data ){
89
+
90
+ $ss = $data;
91
+
92
+
93
+ // ------------------------------
94
+ // 会員番号による集計処理
95
+ // ------------------------------
96
+
97
+ $resMrows = [];
98
+
99
+ // 初期化
100
+ $gtMMpt = 0;
101
+ $gtMMpz = 0;
102
+
103
+ $args = array(
104
+ 'numberposts' => -1,
105
+ 'post_type' => 'post',
106
+ 'post_status' => 'publish',
107
+ 'wildcard_meta_key' => true,
108
+ 'meta_query' => array(
109
+ 'relation' => 'OR',
110
+ array(
111
+ 'key' => 'kzn_post_person01_kzn_p01_cnum',
112
+ 'compare' => '=',
113
+ 'value' => $ss,
114
+ ),
115
+ array(
116
+ 'key' => 'kzn_post_person02_kzn_p02_cnum',
117
+ 'compare' => '=',
118
+ 'value' => $ss,
119
+ ),
120
+ ),
121
+
122
+ );
123
+
124
+ $mm_query = new WP_Query($args);
125
+
126
+ while ( $mm_query->have_posts() ) :
127
+ $mm_query->the_post();
128
+
129
+
130
+ // ページIDの取得
131
+ $pid = get_the_ID();
132
+
133
+ // 基本情報の取得
134
+ if ( have_rows( 'kzn_info' , $pid ) ) :
135
+ while ( have_rows( 'kzn_info' , $pid ) ) : the_row();
136
+ $reg_date = get_sub_field( 'kzn_reg_date' , $pid ); // 登録日
137
+ endwhile;
138
+ endif;
139
+
140
+ // 一人目の受賞者情報の取得
141
+ if ( have_rows( 'kzn_post_person01' , $pid ) ) :
142
+ while ( have_rows( 'kzn_post_person01' , $pid ) ) : the_row();
143
+ $p01num = get_sub_field( 'kzn_p01_cnum' , $pid ); // 会員番号
144
+ $p01pt = get_sub_field( 'kzn_p01_num' , $pid ); // 獲得ポイント
145
+ $p01pz = get_sub_field( 'kzn_p01_money' , $pid ); // 獲得賞金
146
+ endwhile;
147
+ endif;
148
+
149
+ // 二人目の受賞者情報の取得
150
+ if ( have_rows( 'kzn_post_person02' , $pid ) ) :
151
+ while ( have_rows( 'kzn_post_person02' , $pid ) ) : the_row();
152
+ $p02num = get_sub_field( 'kzn_p02_cnum' , $pid ); // 会員番号
153
+ $p02pt = get_sub_field( 'kzn_p02_num' , $pid ); // 獲得ポイント
154
+ $p02pz = get_sub_field( 'kzn_p02_money' , $pid ); // 獲得賞金
155
+ endwhile;
156
+ endif;
157
+
158
+
159
+
160
+ // 月間合計
161
+ if( ( $reg_date > $Mstart ) && ( $reg_date <= $Mend ) ) :
162
+ if( $ss == $p01num ) :
163
+ $gtMMpt = $gtMMpt + $p01pt;
164
+ $gtMMpz = $gtMMpz + $p01pz;
165
+ elseif( ( $p02num ) && ( $ss == $p02num ) ) :
166
+ $gtMMpt = $gtMMpt + $p02pt;
167
+ $gtMMpz = $gtMMpz + $p02pz;
168
+ endif;
169
+ endif;
170
+
171
+ // 年間合計
172
+ if( ( $reg_date > $Ystart ) && ( $reg_date <= $Yend ) ) :
173
+ if( $ss == $p01num ) :
174
+ $gtYYpt = $gtYYpt + $p01pt;
175
+ $gtYYpz = $gtYYpz + $p01pz;
176
+ elseif( ( $p02num ) && ( $ss == $p02num ) ) :
177
+ $gtYYpt = $gtYYpt + $p02pt;
178
+ $gtYYpz = $gtYYpz + $p02pz;
179
+ endif;
180
+ endif;
181
+
182
+
183
+ $resMrows[$ss] = array (
184
+ 'MMpt' => $gtMMpt,
185
+ 'MMpz' => $gtMMpz,
186
+ 'YYpt' => $gtYYpt,
187
+ 'YYpz' => $gtYYpz
188
+ );
189
+
190
+ endwhile;
191
+
192
+ //カスタムクエリをリセット
193
+ wp_reset_postdata();
194
+
195
+ }
53
196
 
54
- (実行結果)
197
+ }
55
- Array
198
+ ?>
56
- (
57
-     [0] => Array
199
+ <h2>抽出データ</h2>
58
-       (
200
+ <div style="border:3px dashed #c00; padding:2rem;">
59
-       [num] => 会員番号
201
+ <pre>
60
- )
202
+ <?php print_r($resMrows); ?>
61
-
62
- 省略
203
+ </pre>
63
-
204
+ </div>
64
205
  ```
65
- **【集計結果の取得】**
66
- ```WordPress
67
- (コード)
68
- $resMrows[会員番号] = array (
69
-     'MMpt' => $gtMMpt,
70
-     'MMpz' => $gtMMpz,
71
-     'YYpt' => $gtYYpt,
72
-     'YYpz' => $gtYYpz
73
- );
74
-
75
- (実行結果)
76
- Array
77
- (
78
- [会員番号] => Array
79
- (
80
- [MMpt] => 0.5
81
- [MMpz] => 250
82
- [YYpt] => 258
83
- [YYpz] => 161250
84
- )
85
-
86
- 省略
87
-
88
- ```
89
-
90
206
  ### 試したこと
91
207
 
92
208
  - (1)の部分を```foreach文```を使って、```$resMrows```の抽出処理をループさせてみましたが、うまく動作しませんでした。