🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

WordPress

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

PHP

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

Q&A

解決済

1回答

1644閲覧

あ行~わ行順に並べて表示 PHP

hakutou5963

総合スコア15

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/12/10 21:43

編集2019/12/11 03:17

下記のサイトの内容で悩んでいます。
リンク内容

<?php $array=Array( array ( "name" => "山田太郎" ,"name_kana" => "やまだたろう" ,"cnt" =>"4" ), array ( "name" => "岩鬼正美" ,"name_kana" => "いわきまさみ" ,"cnt" =>"1" ), array ( "name" => "殿馬一人" ,"name_kana" => "とのまかずと" ,"cnt" =>"2" ), array ( "name" => "里中智" ,"name_kana" => "さとなかさとる" ,"cnt" =>"9" ), array ( "name" => "微笑三太郎" ,"name_kana" => "ほほえみさんたろう" ,"cnt" =>"3" ), array ( "name" => "沢田京太" ,"name_kana" => "さわだきょうた" ,"cnt" =>"1" ), array ( "name" => "北 満男" ,"name_kana" => "きたみつお" ,"cnt" =>"1" ), array ( "name" => "徳川 家康" ,"name_kana" => "とくがわいえやす" ,"cnt" =>"4" ), array ( "name" => "山田サチ子" ,"name_kana" => "やまださちこ" ,"cnt" =>"1" ) ); //元データを あいうえお順にソート foreach ((array) $array as $key => $value) { $sort[$key] = $value['name_kana']; } array_multisort($sort,$array); $kana = array( "あ行" => "[あ-お]", "か行" => "[か-こが-ご]", "さ行" => "[さ-そざ-ぞ]", "た行" => "[た-とだ-ど]", "な行" => "[な-の]", "は行" => "[は-ほば-ぼぱ-ぽ]", "ま行" => "[ま-も]", "や行" => "[や-よ]", "ら行" => "[ら-ろ]", "わ行" => "[わ-ん]", "その他" => ".*" ); echo "<h1>元の配列</h1><br>\n"; //元の配列の内容確認 print_r($array); //処理ココから //結果格納用配列 $result 初期化 $result = array(); //人名データ配列を1行(中身は連想配列)でループ foreach ( $array as $line){ //あ行などのマッチ判定用変数を初期化 $match = FALSE; //人名データのname_kanaに対して、上記の$kana配列をループさせる foreach( $kana as $key => $pattern){ //name_kanaに $kana配列の[あ-お]などのパターンがマッチしたら if (preg_match("/^" . $pattern . "/u", $line['name_kana'])) { // 結果格納用配列$resultに、$kanaのキー名に名前・cntの合成文字列を代入        // アドバイスを元に下記を変更   $result[$key][] = array( 'name' => $line['name'], 'cnt' => $line['cnt'] ); //マッチ判定をTRUEに $match = TRUE; //$kanaのループを抜ける break; } } } echo "<h2>結果配列表示</h2><br>\n"; //結果格納配列の内容を表示 print_r($result); //求める処理 echo "<h2>求める文字列の表示部分です</h2>\n"; foreach($result as $kana => $namearray){ echo $kana."\n"; echo "<ul>\n"; foreach($namearray as $namecnt){ $name = preg_replace('/(\d*)/','',$namecnt ); // 変更 echo "<li><a href=\"siteurl/meta?key=".$name."\">".$namecnt."</a></li>\n"; echo "<li><a href=\"siteurl/meta?key=".$name."\">".$name." ".$cnt."</a></li>\n"; } echo "</ul>\n"; } ?>

nameとcntを一緒に表示されるようになっているのですが、これを分けて表示させる場合はどのようにすればいいのか分かりません。
理想は下記のようにしたい。

echo "<li><a href=\"siteurl/meta?key=".$name."\">".$name." <span class'hoge'>".cnt."</span></a></li>\n";

変更後、確認したら $name $cnt ともArrayになってしまう。

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

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

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

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

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

XNXSXMXR

2019/12/10 22:14 編集

> 理想は下記のようにしたい ここで記述されているコードにすると、エラーになるということでしょうか? エラーが表示された場合、質問にエラー内容を記述したほうが、ヒントが得られると思います。 あと、この質問はWordPressに関する内容でしょうか?
hakutou5963

2019/12/11 02:46

エラーではなく名前(name)とcntを分けて表示させるのがきぼうです。
guest

回答1

0

ベストアンサー

まず、プログラムの先頭行(<?phpの次の行)に、以下を記述してください。

PHP

1// 全てのエラーを拾う 2error_reporting(E_ALL); 3 4// エラーを出力する 5ini_set('display_errors', "On");

これで、どこが悪いのかPHPがエラーメッセージを出してくれます。

75行目のliタグを出力している部分で使われている $namecnt ですが、この中身には「徳川 家康(4)」みたいな文字列がセットされているかと思います。

では、その文字列を作っている(名前とcntを結合させている箇所)はどこでしょうか。
結合させた文字列を$result配列へセットしていますが、文字列ではなく配列をセットしてはいかがでしょうか。

PHP

1$result[$key][] = $line['name']."(".$line['cnt'].")"; 2↓↓ 3$result[$key][] = array( 4 'name' => $line['name'], 5 'cnt' => $line['cnt'] 6 );

これで、名前とcntを分けることができました。
あとは表示部分でも、キー名(名前を出したいときは「name」、cntを出したいときは「cnt」)を指定すると表示できます。

表示部分

foreach($namearray as $namecnt){

この次の行に、以下のコードを追加してみてください。

PHP

1print_r($namecnt);

そうすると、以下のような表示が現れると思います。

Array ( [name] => 岩鬼正美 [cnt] => 1 )

これは$namecntの中身を表示しており、さきほど変更した$line['name']と$line['cnt']の値がそれぞれセットされているのがわかると思います。

分けて表示したい要望ですので、$namecnt['name']と$namecnt['cnt']を指定してあげれば表示できます。

PHP

1echo "<li><a href=\"siteurl/meta?key=".$namecnt['name']."\">".$namecnt['name']." <span class'hoge'>".$namecnt['cnt']."</span></a></li>\n";

preg_replace()について

$name = preg_replace('/(\d*)/','',$namecnt );

これは元々$namecnt に「岩鬼正美(1)」とセットされていた文字列から、カッコ()と数字を削除(空文字に置換)する処理ですので、今回の変更によって不要となります。

投稿2019/12/10 22:23

編集2019/12/11 03:41
XNXSXMXR

総合スコア239

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

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

hakutou5963

2019/12/11 02:43

アドバイスを頂きありがとうございます。 コメントを元に変更したところ、全てArrayと表示されました。
XNXSXMXR

2019/12/11 02:47

「たぶんこういう事になったのかな」と想像はできるのですが、やはり質問者さんが実施に変更したコードと表示結果をみない事には、適切なヒントが出せません。 変更したコードと表示結果を、質問へ追記していただけますでしょうか。
hakutou5963

2019/12/11 03:22

ありがとうございます。 修正と追記を行いました。
XNXSXMXR

2019/12/11 03:42

回答を編集いたしました。ご査収ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問