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

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

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

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

PHP

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

Q&A

解決済

3回答

2609閲覧

phpで複数のカンマ区切りの文字から直積を作って配列に入れたいのですが、入れ子のforeachのエラーを直したい

kooo

総合スコア26

foreach

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

PHP

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

0グッド

0クリップ

投稿2015/10/26 06:28

編集2015/10/26 06:52

はじめまして、ご覧になっていただきありがとうございます。

質問なんですが、仕事のことでカンマ区切りの言葉それぞれの
全組み合わせをphpでもとめたいのですが、

基本はできたのですがどうしても最後の方のforeachの入れ子で
エラーが出てしまいます。

foreachにわたす変数が配列じゃないと出てくるのですが
配列を入れてるつもりなのでお手上げになってしまいました。

どなたかわかる方がいらっしゃればよろしくお願いします。

結果としてこんなカンジに出力できたらと思ってます。

http://qiita.com/mpyw/items/e0b6e0842a460b3f901f#1-2

php

1 2 3 $errorm = 's-non-used'; 4 5 6 //キーワードの直積の一覧を作成 7 //全変数を宣言 8 9 $k['a'] = array( 10 11 'product' => 'pc,phone,heater', 12 13 'event' => '', 14 15 'star' => '', 16 17 'number' => '', 18 19 'trouble' => '', 20 21 'real' => '', 22 23 'desire' => '', 24 25 'price' => '5800,4200,3400,980,1980,580', 26 27 'labor' => '今売れてます,安い,配送無料,無料保証,サービス第一,安全第一,他社よりすごい,今すぐお値引き,係員にお申し付けください', 28 29 ); 30 31 32 //各変数にエラーフラグを格納 33 34 foreach ($k['a'] as $key => $value){ 35 36 if($value === ''){ 37 38 $value = $errorm; 39 40//本来はelseでGETから変数を取得しています。 41 42 } 43 } 44 45 46 //各変数をカンマで切り分けて配列にする 47 foreach ($k['a'] as $value){ 48 49 if($value === $errorm){ 50 51 unset($value); 52 53 } else { 54 55 56 $value = explode( ',', preg_replace ("/,+/",',',$value)); 57 58 } 59 60 } 61 62//指摘により追加しました 63$words = $k; 64 $k = ''; 65 66 //全nameに対しての繰り返し処理ex)product,price,star... 67 foreach ($words['a'] as $key => $value){ 68 69 //受け入れ配列の要素数を入力配列の要素数分増やす 70 71 if($k === ''){ 72 73 $k = $value; 74 75 } else { 76 77 $t = 0; 78 79 80//ここから下でエラーが出てます。 81 82 //新しく入れる分重複要素を増やす 83 foreach($k as $value2){ 84 85 foreach($value as $i){ 86 87 $depot[] = $value2; 88 89 } 90 91 } 92 93 //増やした重複要素に新しく入れる分を全パターン入れる 94 foreach($k as $i){ 95 96 foreach ($value as $value2){ 97 98 $depot["$t"]["$key"] = $value2; 99 100 ++$t; 101 102 } 103 104 } 105 106 $k = $depot; 107 108 unset($depot); 109 110 } 111 112 } 113 114

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

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

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

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

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

guest

回答3

0

自己解決

お二方のソースを実行しましたが直積にはなりませんでしたが、
とても参考になる意見をありがとうございました。

自己解決できましたので、ソースをそのまま貼っつけときます。
直積を作りたい複数の配列を一つの配列に2次元配列としてまとめて渡すと
直積の全パターンを2次元配列に格納して出力します。

ミスをしていたのはイテレータのvalueに値を入れても元の配列に反映されないということでした。

php

1 $errorm = 's-non-used'; 2 3 $i = 'a'; 4 5 6 7 //検索ボックスから値取得 8 9 //全変数を宣言 10 11 $k['a'] = array( 12 13 'product' => 'pc,phone,,heater', 14 15 'event' => '', 16 17 'star' => '', 18 19 'number' => '', 20 21 'trouble' => '', 22 23 'real' => '', 24 25 'desire' => '', 26 27 'price' => '5800,,,,,4200,3400,980,1980,580', 28 29 'labor' => '今売れてます,安い,配送無料,無料保証,サービス第一,安全第一,他社よりすごい,今すぐお値引き,係員にお申し付けください', 30 31 ); 32 33 34 //各変数に値を格納 35 36 foreach ($k['a'] as $key => $value){ 37 38 if($value === ''){ 39 40 $k['a']["$key"] = $errorm; 41 42 } 43 } 44 45 //priceとlaborをもう1つの変数にまとめる 46 47 if($k['a']['price'] === $errorm and $k['a']['labor'] === $errorm){ 48 49 $k['a']['cost'] = $errorm; 50 51 } else { 52 53 $k['a']['cost'] = str_replace ($errorm , '' ,$k['a']['price'] . ',' .$k['a']['labor']); 54 55 } 56 57 58 59 60 //各変数をカンマで切り分けて配列にする 61 foreach ($k['a'] as $key => $value){ 62 63 if($value === $errorm){ 64 65 unset($k['a']["$key"]); 66 67 } else { 68 69 $k['a']["$key"] = explode( ',' , preg_replace ("/,+/",',',$value)); 70 71 } 72 73 } 74 75 76 77 //キーワードの直積の一覧を作成 78 $words = $k; 79 80 $k = array(); 81 82 //全nameに対しての繰り返し処理ex)product,price,star... 83 foreach ($words['a'] as $key => $value){ 84 85 //受け入れ配列の要素数を入力配列の要素数分増やす 86 87 $t = 0; 88 89 if(empty($k) === TRUE){ 90 91 foreach ($value as $value2){ 92 93 $k["$t"]["$key"] = $value2; 94 95 ++$t; 96 97 } 98 99 } else { 100 101 //新しく入れる分重複要素を増やす 102 foreach($k as $value2){ 103 104 foreach($value as $i){ 105 106 $depot[] = $value2; 107 108 } 109 110 } 111 112 //増やした重複要素に新しく入れる分を全パターン入れる 113 foreach($k as $i){ 114 115 foreach ($value as $value2){ 116 117 $depot["$t"]["$key"] = $value2; 118 119 ++$t; 120 121 } 122 123 } 124 125 $k = $depot; 126 127 unset($depot); 128 129 } 130 131 } 132 133 134print_r($k); 135 136

投稿2015/10/27 14:50

kooo

総合スコア26

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

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

0

お手数ですが、
$words の設定値を教えていただけないでしょうか?
foreachの参照元に $words['a']が設定されていますが、掲載されているソースには、$wordsが宣言されていないようです。

ソース確認いたしました。
3か所に間違いと思われる個所がございました。(コメントをご参照ください)
されたいことがあっているかどうか判断しかねますが、文法エラーはなくなりました。

php

1<?php 2$errorm = 's-non-used'; 3 4 5 //キーワードの直積の一覧を作成 6 //全変数を宣言 7 8 $k['a'] = array 9 ( 10 11 'product' => 'pc,phone,heater', 12 'event' => '', 13 'star' => '', 14 'number' => '', 15 'trouble' => '', 16 'real' => '', 17 'desire' => '', 18 'price' => '5800,4200,3400,980,1980,580', 19 'labor' => '今売れてます,安い,配送無料,無料保証,サービス第一,安全第一,他社よりすごい,今すぐお値引き,係員にお申し付けください', 20 21 ); 22 23 //各変数にエラーフラグを格納 24 foreach ($k['a'] as $key => $value) 25 { 26 if($value === '') 27 { 28 $value = $errorm; 29 30//本来はelseでGETから変数を取得しています。 31 } 32 } 33 34 //各変数をカンマで切り分けて配列にする 35 foreach ($k['a'] as $key => $value) 36 { 37 if($value === $errorm) 38 { 39 unset($value); 40 } 41 else 42 { 43//修正点① 44//ここでカンマ区切りのデータを配列化していますが、$kに反映されていませんでした。 45 $k['a'][$key] = explode( ',', preg_replace ("/,+/",',',$value)); 46 } 47 } 48 49 $words = $k; 50 $k = ''; 51 52 //全nameに対しての繰り返し処理ex)product,price,star... 53 foreach ($words['a'] as $key => $value) 54 { 55 56 //受け入れ配列の要素数を入力配列の要素数分増やす 57 if($k === '') 58 { 59 $k = $value; 60 } 61 62//修正点2 63// 上記if 文のelse時のみ実行されますが、$words配列1個目が必ず処理されていません 1件目の"product"が処理されていませんでした。 64 65 $t = 0; 66//ここから下でエラーが出てます。 67 68 //新しく入れる分重複要素を増やす 69 foreach($k as $value2) 70 { 71 foreach($value as $i) 72 { 73 $depot[] = $value2; 74 } 75 } 76 77 //増やした重複要素に新しく入れる分を全パターン入れる 78 foreach($k as $i) 79 { 80 foreach ($value as $value2) 81 { 82// 修正点3 83// $depot への代入文法に間違いがございました。(2次配列の宣言後に代入) 84 85 $depot[$t] = array($key=>$value2); 86 ++$t; 87 } 88 } 89 90 $k = $depot; 91 unset($depot); 92 } 93?>

投稿2015/10/26 06:56

編集2015/10/26 07:44
KenjiObata

総合スコア440

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

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

kooo

2015/10/26 08:55

訂正ありがとうございます! $wordsの設定値ですが、$words = $k; で$kの一時置き場としてそのままの値を使ってます。 修正点2についてなのですが、最初$kが空なので //新しく入れる分重複要素を増やす のイテレータがエラーになるかと思って分岐させてます。 "product"を空の$kに格納できればと思うのですが、 もしわかればよろしくお願いします。
guest

0

こんにちは。

$k = ''
なので、配列じゃないというエラーが出るんじゃないですか?

$k = array();
にしてみたらどうでしょう?
あと記載されたソースを見る限り、$wordsも宣言されていないので同じエラーが出そう。別のところで宣言されているなら問題ありませんが。

投稿2015/10/26 06:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kooo

2015/10/26 06:55

$wordsが抜けてました、ありがとうございます。 foreach内のif文の中で配列を代入してるから大丈夫かと思ったのですができなかったのですね。。 いま出先なので家に帰ったら修正してみます! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問