質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

757閲覧

配列の操作方法について

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/11/09 01:25

編集2020/11/09 04:18

前提・実現したいこと

Wordpressのカスタムフィールドを利用して、データの抽出・配列操作を行いたいと思っています。

基本となるテーブルの構成は、該当のソースコードの通りです。

やりたいことは次の通りです。
0. **『会員番号だけのリスト($pLrows)』**の会員番号の分だけ『集計結果』のループ処理($resMrows)をできるようにしたい。

【希望とする配列要素】
初期ブログから抽出した会員番号リスト|$gtMMpt|$gtMMpz|$gtYYpt|$gtYYpz

サーバー仕様

[ O S ] Windows 10
[Server] XAMPP 7.3.22
[ PHP ] 7.4.10
[ D B ] MariaDB 10.3.15
[ W P ] 5.5.1-ja

該当のソースコード

現状のソースコードを、次の通り、ご報告します。

wordpress

1<?php 2 3 // 期間設定の読込 4 $Mstart = do_shortcode( '[vMstart]' ); // 月間開始日 5 $Mend = do_shortcode( '[vMend]' ); // 月間終了日 6 $Ystart = do_shortcode( '[vYstart]' ); // 年間開始日 7 $Yend = do_shortcode( '[vYend]' ); // 年間終了日 8 9?> 10 11<?php 12 13 // ------------------------------ 14 // 会員名簿データからデータ抽出 15 // ------------------------------ 16 17 // 会員名簿データのページID 18 $pid = '6085'; 19 20 // 配列の初期化 21 $cLrows = []; 22 $pLrows = []; 23 24 // メインBLOG(blogID:1)データへ切替 25 if (get_current_blog_id() != 1) { 26 switch_to_blog(1); 27 } 28 29 // 会員名簿の読込&配列 30 if ( have_rows( 'list' , $pid ) ) : 31 while ( have_rows( 'list' , $pid ) ) : the_row(); 32 $gtNum = get_sub_field( 'num' , $pid ); 33 $gtClass = get_sub_field( 'class' , $pid ); 34 $gtName = get_sub_field( 'name' , $pid ); 35 $gtPos = get_sub_field( 'pos' , $pid ); 36 37 // PHASE01:会員名簿リスト 38 $cLrows[$gtNum] = array( 39 'class' => $gtClass, 40 'name' => $gtName, 41 'pos' => $gtPost 42 ); 43 44 // PHASE02会員番号リスト 45 $pLrows[] = array( 46 'num' => $gtNum 47 ); 48 endwhile; 49 endif; 50 51 //カスタムクエリをリセット 52 wp_reset_postdata(); 53?> 54<?php 55 56 // 集計用BLOG(blogID:18)データへ切替 57 if (get_current_blog_id() != 18) { 58 switch_to_blog(18); 59 } 60?> 61<?php 62 63 // 会員番号リストのループ処理 64 foreach( $pLrows as $rows ){ 65 66 foreach( $rows as $data ){ 67 68 $ss = $data; 69 70 71 // ------------------------------ 72 // 会員番号による集計処理 73 // ------------------------------ 74 75 $resMrows = []; 76 77 // 初期化 78 $gtMMpt = 0; 79 $gtMMpz = 0; 80 81 $args = array( 82 'numberposts' => -1, 83 'post_type' => 'post', 84 'post_status' => 'publish', 85 'wildcard_meta_key' => true, 86 'meta_query' => array( 87 'relation' => 'OR', 88 array( 89 'key' => 'kzn_post_person01_kzn_p01_cnum', 90 'compare' => '=', 91 'value' => $ss, 92 ), 93 array( 94 'key' => 'kzn_post_person02_kzn_p02_cnum', 95 'compare' => '=', 96 'value' => $ss, 97 ), 98 ), 99 100 ); 101 102 $mm_query = new WP_Query($args); 103 104 while ( $mm_query->have_posts() ) : 105 $mm_query->the_post(); 106 107 108 // ページIDの取得 109 $pid = get_the_ID(); 110 111 // 基本情報の取得 112 if ( have_rows( 'kzn_info' , $pid ) ) : 113 while ( have_rows( 'kzn_info' , $pid ) ) : the_row(); 114 $reg_date = get_sub_field( 'kzn_reg_date' , $pid ); // 登録日 115 endwhile; 116 endif; 117 118 // 一人目の受賞者情報の取得 119 if ( have_rows( 'kzn_post_person01' , $pid ) ) : 120 while ( have_rows( 'kzn_post_person01' , $pid ) ) : the_row(); 121 $p01num = get_sub_field( 'kzn_p01_cnum' , $pid ); // 会員番号 122 $p01pt = get_sub_field( 'kzn_p01_num' , $pid ); // 獲得ポイント 123 $p01pz = get_sub_field( 'kzn_p01_money' , $pid ); // 獲得賞金 124 endwhile; 125 endif; 126 127 // 二人目の受賞者情報の取得 128 if ( have_rows( 'kzn_post_person02' , $pid ) ) : 129 while ( have_rows( 'kzn_post_person02' , $pid ) ) : the_row(); 130 $p02num = get_sub_field( 'kzn_p02_cnum' , $pid ); // 会員番号 131 $p02pt = get_sub_field( 'kzn_p02_num' , $pid ); // 獲得ポイント 132 $p02pz = get_sub_field( 'kzn_p02_money' , $pid ); // 獲得賞金 133 endwhile; 134 endif; 135 136 137 138 // 月間合計 139 if( ( $reg_date > $Mstart ) && ( $reg_date <= $Mend ) ) : 140 if( $ss == $p01num ) : 141 $gtMMpt = $gtMMpt + $p01pt; 142 $gtMMpz = $gtMMpz + $p01pz; 143 elseif( ( $p02num ) && ( $ss == $p02num ) ) : 144 $gtMMpt = $gtMMpt + $p02pt; 145 $gtMMpz = $gtMMpz + $p02pz; 146 endif; 147 endif; 148 149 // 年間合計 150 if( ( $reg_date > $Ystart ) && ( $reg_date <= $Yend ) ) : 151 if( $ss == $p01num ) : 152 $gtYYpt = $gtYYpt + $p01pt; 153 $gtYYpz = $gtYYpz + $p01pz; 154 elseif( ( $p02num ) && ( $ss == $p02num ) ) : 155 $gtYYpt = $gtYYpt + $p02pt; 156 $gtYYpz = $gtYYpz + $p02pz; 157 endif; 158 endif; 159 160 161 $resMrows[$ss] = array ( 162 'MMpt' => $gtMMpt, 163 'MMpz' => $gtMMpz, 164 'YYpt' => $gtYYpt, 165 'YYpz' => $gtYYpz 166 ); 167 168 endwhile; 169 170 //カスタムクエリをリセット 171 wp_reset_postdata(); 172 173 } 174 175} 176?> 177<h2>抽出データ</h2> 178<div style="border:3px dashed #c00; padding:2rem;"> 179<pre> 180<?php print_r($resMrows); ?> 181</pre> 182</div>

試したこと

  • (1)の部分をforeach文を使って、$resMrowsの抽出処理をループさせてみましたが、うまく動作しませんでした。

php

1foreach($cLrows as $rows){ 2foreach($rows as $data){ 3$ss = $data; 45中略 67$resMrows[$ss] = array ( 8    'MMpt' => $gtMMpt, 9    'MMpz' => $gtMMpz, 10    'YYpt' => $gtYYpt, 11    'YYpz' => $gtYYpz 12); 13} 14}
  • $ssの値を、foreach文を使用せず、”1206(基準値)”を設定すると、会員番号1206の集計結果がきちんと表示されます。ただし、ループ処理を行っていないため、単一の会員番号の集計結果のみしか集計できません。

  • phpなどのリファレンスを読んだり、「PHP 2次元配列」で検索してヒットした記事などを読みあさりましたが、解決できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分自身でも「なぜ思い通りの動作をしてくれるようになったのか」がわからないのですが、
下記の通り、該当のソースコードを書き換えたら、思い通りの結果が集計できるようになりました。

毎度お騒がせしまして、申し訳ございません。

php

1<?php 2 3 // ------------------------------ 4 // 初期設定ページから設定条件を読込 5 // ------------------------------ 6 7 // 期間設定の読込 8 $Mstart = do_shortcode( '[vMstart]' ); // 月間開始日 9 $Mend = do_shortcode( '[vMend]' ); // 月間終了日 10 $Ystart = do_shortcode( '[vYstart]' ); // 年間開始日 11 $Yend = do_shortcode( '[vYend]' ); // 年間終了日 12 13 // ------------------------------ 14 // 会員名簿データからデータ抽出 15 // ------------------------------ 16 17 // 会員名簿データのページID 18 $pid = '6085'; 19 20 // 配列の初期化 21 $cLrows = []; 22 $pLrows = []; 23 24 // メインBLOG(blogID:1)データへ切替 25 if (get_current_blog_id() != 1) { 26 switch_to_blog(1); 27 } 28 29 // 会員名簿の読込&配列 30 if ( have_rows( 'list' , $pid ) ) : 31 while ( have_rows( 'list' , $pid ) ) : the_row(); 32 $gtNum = get_sub_field( 'num' , $pid ); 33 $gtClass = get_sub_field( 'class' , $pid ); 34 $gtName = get_sub_field( 'name' , $pid ); 35 $gtPos = get_sub_field( 'pos' , $pid ); 36 37 // PHASE01:会員名簿リスト 38 $cLrows[$gtNum] = array( 39 'class' => $gtClass, 40 'name' => $gtName, 41 'pos' => $gtPost 42 ); 43 44 // PHASE02:会員番号リスト 45 $pLrows[$gtNum] = array( 46 'num' => $gtNum 47 ); 48 endwhile; 49 endif; 50 51?> 52<?php 53 54 // 集計用BLOG(blogID:18)データへ切替 55 if (get_current_blog_id() != 18) { 56 switch_to_blog(18); 57 } 58 59 // ------------------------------ 60 // 会員番号による集計処理 61 // ------------------------------ 62 63 // 初期化 64 $gtMMpt = 0; 65 $gtMMpz = 0; 66 $resMrows = []; 67 68 // 会員番号リストと集計結果をひもづけ 69 foreach( $pLrows as $rows) { 70 foreach ( $rows as $data) { 71 72 $ss = $data; 73 // $ss = 1200; 74 75 $args = [ 76 'numberposts' => -1, 77 'post_type' => 'post', 78 'post_status' => 'publish', 79 'wildcard_meta_key' => true, 80 'meta_query' => [ 81 'relation' => 'OR', 82 [ 83 'key' => 'kzn_post_person01_kzn_p01_cnum', 84 'compare' => '=', 85 'value' => $ss, 86 ], 87 [ 88 'key' => 'kzn_post_person02_kzn_p02_cnum', 89 'compare' => '=', 90 'value' => $ss, 91 ] 92 ] 93 ]; 94 95 $mm_query = new WP_Query($args); 96 97 while ( $mm_query->have_posts() ) : 98 $mm_query->the_post(); 99 100 // ページIDの取得 101 $pid = get_the_ID(); 102 103 // 基本情報の取得 104 if ( have_rows( 'kzn_info' , $pid ) ) : 105 while ( have_rows( 'kzn_info' , $pid ) ) : the_row(); 106 $reg_date = get_sub_field( 'kzn_reg_date' , $pid ); // 登録日 107 endwhile; 108 endif; 109 110 // 一人目の受賞者情報の取得 111 if ( have_rows( 'kzn_post_person01' , $pid ) ) : 112 while ( have_rows( 'kzn_post_person01' , $pid ) ) : the_row(); 113 $p01num = get_sub_field( 'kzn_p01_cnum' , $pid ); // 会員番号 114 $p01pt = get_sub_field( 'kzn_p01_num' , $pid ); // 獲得ポイント 115 $p01pz = get_sub_field( 'kzn_p01_money' , $pid ); // 獲得賞金 116 endwhile; 117 endif; 118 119 // 二人目の受賞者情報の取得 120 if ( have_rows( 'kzn_post_person02' , $pid ) ) : 121 while ( have_rows( 'kzn_post_person02' , $pid ) ) : the_row(); 122 $p02num = get_sub_field( 'kzn_p02_cnum' , $pid ); // 会員番号 123 $p02pt = get_sub_field( 'kzn_p02_num' , $pid ); // 獲得ポイント 124 $p02pz = get_sub_field( 'kzn_p02_money' , $pid ); // 獲得賞金 125 endwhile; 126 endif; 127 128 // 月間合計 129 if( ( $reg_date > $Mstart ) && ( $reg_date <= $Mend ) ) : 130 $gtMMpt = $gtMMpt + $p01pt; 131 $gtMMpz = $gtMMpz + $p01pz; 132 if( $p02num ) : 133 $gtMMpt = $gtMMpt + $p02pt; 134 $gtMMpz = $gtMMpz + $p02pz; 135 endif; 136 endif; 137 138 // 年間合計 139 if( ( $reg_date > $Ystart ) && ( $reg_date <= $Yend ) ) : 140 $gtYYpt = $gtYYpt + $p01pt; 141 $gtYYpz = $gtYYpz + $p01pz; 142 if( $p02num ) : 143 $gtYYpt = $gtYYpt + $p02pt; 144 $gtYYpz = $gtYYpz + $p02pz; 145 endif; 146 endif; 147 148 $resMrows[$ss] = [ 149 'MMpt' => $gtMMpt, 150 'MMpz' => $gtMMpz, 151 'YYpt' => $gtYYpt, 152 'YYpz' => $gtYYpz 153 ]; 154 endwhile; 155 156 } 157 158 } 159?> 160<h2>抽出データ</h2> 161 162<div style="border:3px dashed #c00; padding:2rem;"> 163<pre> 164<?php print_r($resMrows); ?> 165</pre> 166</div>```

投稿2020/11/09 05:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問