https://oshiete.goo.ne.jp/qa/9714215.html
で質問したのですが、疑問点を絞りましたので質問し直します。
例えば次の場合、
「echo "<br>";」よりも上の方が正しくて下は問題があることは分かります。
内側のforeachの前では外側のforeachの$keyになりますが、
内側のforeachの後では内側のforeachの$keyになってしまいます。
結果の0-A abc の後が0-Aではなく2-Cになってしまった所です。
ここまでは当然だと理解できるのですが、
内側のforeachの前に戻った時に外側のforeachの$keyに戻る仕組みが分かりません。
結果の2-Cの後が3-Dではなく1-Bに戻っている所です。
この理由について、どなたか、分かりやすく解説していただけないでしょうか。
よろしくお願いします。

<?php
$name = array("A","B","C","D");
$list = array("a","b","c");
foreach ($name as $key1 => $val1) {
echo $key1."-".$name[$key1]."<br>";
foreach ($list as $key2 => $val2) {
echo $list[$key2];
}
echo "<br>".$key1."-".$name[$key1]."<br>";
}
echo "<br>";
foreach ($name as $key => $val) {
echo $key."-".$name[$key]."<br>";
foreach ($list as $key => $val) {
echo $list[$key];
}
echo "<br>".$key."-".$name[$key]."<br>";
}
exit;
?>
結果:
0-A
abc
0-A
1-B
abc
1-B
2-C
abc
2-C
3-D
abc
3-D

0-A
abc
2-C
1-B
abc
2-C
2-C
abc
2-C
3-D
abc
2-C

A 回答 (1件)

> 結果の2-Cの後が3-Dではなく1-Bに戻っている



foreachで配列を走査するのにキーは使われていません。
配列は内部ポインタというものをもっていて、現時点のカレント位置を保持します
foreachによって次のポインタに移ったときに再度$keyが読み直されます

一方、forで回す場合は$iなど配列とは直接関係ないカウンタを使うため、
$iが上書きされてしまうと挙動がおかしくなります
    • good
    • 0
この回答へのお礼

yambejpさん、引き続き回答していただき、ありがとうございました。
「内部ポインタ」という言葉を理解せずに使っていました。
改めて検索して調べてみました。
おかげ様で疑問点が解消しました。
私のプログラムが問題なく動作していたことが疑問だったのですが、
ようやく納得しました。
ありがとうございました。

お礼日時:2017/04/14 15:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q複数のforeachをまとめるには

下記の質問と全く同じことをしたいのですが

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1332135363

回答をみても分かりませんでした。

array_mergeを使うとあったので

foreach ($xmlData->Item as $itemValue)

foreach ($xmlData2->Item as $itemValue2)

$result = array_merge($itemValue, $itemValue2);
print_r($result);

としてみましたが、

Warning: array_merge() [function.array-merge]: Argument #1 is not an array

とエラーが出てしまいます。

最終的には以下のようにDBに入れたいと思っているのですが
その前段階としてforeachをまとめるにはどのようにしたらよいででしょうか。

$sql = "INSERT INTO teble (itemname,price) VALUES ('".$itemValue."','".$itemValue2."')";

下記の質問と全く同じことをしたいのですが

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1332135363

回答をみても分かりませんでした。

array_mergeを使うとあったので

foreach ($xmlData->Item as $itemValue)

foreach ($xmlData2->Item as $itemValue2)

$result = array_merge($itemValue, $itemValue2);
print_r($result);

としてみましたが、

Warning: array_merge() [function.array-merge]: Argument #1 is not an array

とエラーが出てしまいます。

最終的には以下のようにDBに...続きを読む

Aベストアンサー

そもそも$xmlData->Itemは(Objectであって)配列ではありませんよね?foreachが配列以外も扱えるからといって、配列関数でも(配列ではないObjectが)扱えるというわけではありません。

$arr1 = array();
$arr2 = array();

としておいて、

foreach ($xmlData->Item as $itemValue) { $arr1[] = $itemValue; }
foreach ($xmlData2->Item as $itemValue) { $arr2[] = $itemValue; }

foreach ($arr1 as $key=>$itemValue1) {
$itemValue2 = $arr2[$key];
// $itemValue1 と $itemValue2 を使って処理
}

などとした方が手っ取り早いと思います。

Qネストが深い時のforeachはどうすれば良い?

■現状
・APIリクエスト結果をPHPで受け取っているのですが、ネストがとても深いです
・個別に表示させようとしたら、4重foreachになりました

■質問
・ネストが深い多次元配列から、スマートにデータを取得するにはどうすれば良いでしょうか?
※同じようなことさえ出来れば、foreachでなくても構いません

Aベストアンサー

>4重foreachになりました

何か問題がありますか?

添え字が既知ならforeachで回したりはしませんから「添え字がわからない」のですよね。他に方法がない以上は仕方ないです。

Qphpでforeachの中にforeachがある場合の記述方法について

例えば、次のような場合、
「echo "<br>";」よりも上と下は同じ結果になるのですが、
上の方が正しくて下の方は問題があると思っていました。
エラーが出なければ、実は問題が無いのでしょうか?
問題が無いとしたら、
外側と内側で同じ「$key」を使っても問題が無い理由が分かりません。
どなたか、教えてください。よろしくお願いします。

<?php
$name = array("A","B","C","D");
$list = array("a","b","c");
foreach ($name as $key1 => $val1) {
foreach ($list as $key2 => $val2) {
echo $list[$key2]."<br>";
}
}
echo "<br>";
foreach ($name as $key => $val) {
foreach ($list as $key => $val) {
echo $list[$key]."<br>";
}
}
exit;
?>
結果:
a
b
c
a
b
c
a
b
c
a
b
c

a
b
c
a
b
c
a
b
c
a
b
c

例えば、次のような場合、
「echo "<br>";」よりも上と下は同じ結果になるのですが、
上の方が正しくて下の方は問題があると思っていました。
エラーが出なければ、実は問題が無いのでしょうか?
問題が無いとしたら、
外側と内側で同じ「$key」を使っても問題が無い理由が分かりません。
どなたか、教えてください。よろしくお願いします。

<?php
$name = array("A","B","C","D");
$list = array("a","b","c");
foreach ($name as $key1 => $val1) {
foreach ($list as $key2 => $val2) {
echo $li...続きを読む

Aベストアンサー

下の書き方だと$nameのキーや値にアクセスしづらいのでNGです。

Qphpの問題でIF文を用いて、成績を入力し、60点以上70点未満なら"可"、70点以上80点未満なら

phpの問題でIF文を用いて、成績を入力し、60点以上70点未満なら"可"、70点以上80点未満なら"良"、80点以上90点未満なら"優"、90点以上なら"秀"と表示するプログラムを作成せよ。
この問題の解答を教えてください。お願いします。

Aベストアンサー

流れ的にはこんな感じ

<form method="get">
<input type="text" name="val">
<input type="submit" value="go">
</form>
<?PHP
$val=filter_input(INPUT_GET,"val");
if(is_numeric($val)){
$ret="不可";
if($val>=90) $ret="秀";
if($val>=80) $ret="優";
if($val>=70) $ret="良";
if($val>=60) $ret="可";
print htmlspecialchars($val).":".$ret;
}
?>

Qテキストエディタでindex.htmlで保存、ブラウザ表示が?

JavaScriptを勉強中です。
テキストエディタでindex.htmlで保存し
ブラウザ表示をすると画像のようになりました。

何が原因でしょうか?

Aベストアンサー

パソコンで作業されていますか?
その場合、HTML中で文字コードを指定していて、それがShift-JIS以外になっていませんか?
つまりファイルの中身の文字コードはS-JISなのに、HTMLとしてはS-JIS以外の文字コードを指定しているので、ブラウザはHTMLでの指定を信じて表示しているので化け化けになると。。。

参考まで。

Qphp sprintfの中で、ifのような機能を使うには?

下記のコードでは、sprintfにクエリを書いていますが、その中でも一部の行だけifを使って条件分岐で切り替えることができないものかと思いました? もちろん下記のコードでは動きませんが、イメージとしては、このような感じです。


try{

$sql = sprintf('SELECT '
. 'SQL_CALC_FOUND_ROWS %1$s.ID,'
. '%1$s.ID, '
. '%1$s.post_author,'
. '%1$s.post_title, '
. '%1$s.post_date, '
. '%1$s.post_status,'
. '(SELECT %2$s.name FROM %2$s WHERE %1$s.category = %2$s.term_id) AS category , '
. '(SELECT %2$s.name FROM %2$s WHERE %1$s.category_child = %2$s.term_id) AS category_child , '
. '%1$s.post_content , '
. '(SELECT count(%3$s.post_id) FROM %3$s WHERE %1$s.ID = %3$s.post_id) AS b_count, '
. '(SELECT count(%4$s.post_id) FROM %4$s WHERE %1$s.ID = %4$s.post_id) AS l_count, '
. '(SELECT count(%5$s.comment_ID) FROM %5$s WHERE %1$s.ID = %5$s.comment_post_ID) AS c_count '

if(isset($ID)){
. 'FROM %1$s WHERE %1$s.post_author = :post_author AND %1$s.post_status = 2 ORDER BY %1$s.post_date DESC LIMIT %6$s, %7$s', $this->posts, $this->category,$this->bookmark,$this->like,$this->comments,$limit, $offset);
}elseif(isset($ID) AND $ID==$user_id){
. 'FROM %1$s WHERE %1$s.post_author = :post_author AND %1$s.post_status = 3 ORDER BY %1$s.post_date DESC LIMIT %6$s, %7$s', $this->posts, $this->category,$this->bookmark,$this->like,$this->comments,$limit, $offset);
}else{
. 'FROM %1$s WHERE %1$s.post_author = :post_author AND %1$s.post_status = 1 ORDER BY %1$s.post_date DESC LIMIT %6$s, %7$s', $this->posts, $this->category,$this->bookmark,$this->like,$this->comments,$limit, $offset);
}


$stmt = $this->db->prepare($sql);
$stmt->bindValue('post_author', $user_id);
$stmt->execute();
$data['all'] = $stmt->fetchAll();

下記のコードでは、sprintfにクエリを書いていますが、その中でも一部の行だけifを使って条件分岐で切り替えることができないものかと思いました? もちろん下記のコードでは動きませんが、イメージとしては、このような感じです。


try{

$sql = sprintf('SELECT '
. 'SQL_CALC_FOUND_ROWS %1$s.ID,'
. '%1$s.ID, '
. '%1$s.post_author,'
. '%1$s.post_title, '
. '%1$s.post_date, '
. ...続きを読む

Aベストアンサー

三項演算子でがんばってみては?

$flg=true;
$str="hogehoge".($flg?" fugafuga":" piyopiyo")." hogera";
print $str;

※ただし三項演算子で条件が3つになるとグルーピングを明確にしないといけませんが・・・

QPHP 画像の表示

プログラミング初心者です。
PHPでブラウザに画像を表示したいのですが映らなくて
以下のソースコードは間違っているでしょうか?

<?php
$fileName = "img/test.jpg"; //ファイル名

if (file_exists($fileName)) {
header('Content-type: image/jpeg');
header('Content-Length: '.filesize("http://localhost:8080/test.jpg")); //あった方が良い
readfile("http://localhost:8080/test.jpg"); //ファイルを読み込んで標準出力に書き出し
exit;
}
?>

Aベストアンサー

file_existsで所在確認しているのに
なんでfilesizeやreadfileでhttpベースに書き直しているのでしょうか?
filesize($fileName)やreadfile($fileName)で試してみて下さい

ちなみに、readfileはバイナリセーフではないので
基本的にはfopen、fread、fcloseの流れでデータを読んで出力してください

QPHP getimagesize();

プログラミング初心者です。
現在、PHPにてブラウザに画像の表示をしようとしているのですが
上手く行きません。ソースコードを張るのでダメなところがありましたら
手ほどきの程お願い致します。
ーーーーー
<?php
$fileName = "test.jpg"; //ファイル名

if (file_exists($fileName)) {
header('Content-type: image/jpeg');
header('Content-Length: '.filesize($fileName)); //あった方が良い
readfile($fileName); //ファイルを読み込んで標準出力に書き出し
★getimagesize(test.jpg);
exit;
}else{
echo "b";
}
?>
ーーーー

目的

- phpにてブラウザに画像の表示

状況

- 最初は★のある行はなしでやっていたが

画像が映るも、かなり小さかったので大きくしようと
★のある行を追加。

- 画像の小ささはスクリーンショットを参考

プログラミング初心者です。
現在、PHPにてブラウザに画像の表示をしようとしているのですが
上手く行きません。ソースコードを張るのでダメなところがありましたら
手ほどきの程お願い致します。
ーーーーー
<?php
$fileName = "test.jpg"; //ファイル名

if (file_exists($fileName)) {
header('Content-type: image/jpeg');
header('Content-Length: '.filesize($fileName)); //あった方が良い
readfile($fileName); //ファイルを読み込んで標準出力に書き出し
★getimagesize(test.jpg);
exit;
}...続きを読む

Aベストアンサー

ブラウザで「画像のみ表示」みたいなことをすると、その画像だけが表示されますよね?
今のプログラムはそれと同じことをやっている(=画像のみを表示している)状態です。
★ のようなことをしても影響ありません。(最悪、不正な画像データとなってしまって表示できなくなるかもしれません)


URL に 〜.jpg とやると、そのファイルがそのままアクセスできるように見えます。
ですが、実際には、サーバープログラム(Apache等)の中で、あなたのPHPスクリプトと同じような手順(ファイルの内容を読み込み、ヘッダを就けて送信)を行なっています。
ブラウザ側では、今どちらの方法で送られて来たデータかは区別できません。


この画像の表示を制御したいのなら、 HTMLの imgタグのSRCとしてこのスクリプトを指定するなどの工夫が必要です

Qこのプログラムを説明すにあたり!

私は頭が錆びないようにPHPプログラムを勉強しています。
以下のプログラムはPHP参考書の通りに入力しました。
 しかし!<?php~?>の順番を変えてもプログラムは動きます。
そこで、もしあなたが第三者に以下のプログラムの流れを説明しようとした場合
主観でもいいのですが、最初にどんなプログラムを持ってきますか?
 よろしくお願いします。
<!DOCTYPE html>
<html>
<head>
<title>P262 Sample8-4 コンストラクタとクラスの変数</title>
</head>
<body>

<?php

$pr1 = new Person("鈴木",56);
$pr2 = new Person("佐藤",38);
?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>名前</th>
<th>年齢</th>
</tr>

<?php

print "<tr><td>";
print $pr1->getname();
print "</td><td>";
print $pr1->getage();
print "</td></tr>";

print "<tr><td>";
print $pr2->getname();
print "</td><td>";
print $pr2->getage();
print "</td></tr>";

?>
</table>

<?php

print "<hr>";
print "合計人数:";
print Person::$count;

?>

<?php

class Person
{

public static $count = 0;

public function __construct($nm,$ag)

{
person::$count++;


$this->name = $nm;
if($ag>=20 && $ag<=60){
$this->age = $ag;
}
else
$this->age = -1;
}
public function getname(){return $this->name;}
public function getage(){return $this->age;}
}

?>

</body>
</html>

私は頭が錆びないようにPHPプログラムを勉強しています。
以下のプログラムはPHP参考書の通りに入力しました。
 しかし!<?php~?>の順番を変えてもプログラムは動きます。
そこで、もしあなたが第三者に以下のプログラムの流れを説明しようとした場合
主観でもいいのですが、最初にどんなプログラムを持ってきますか?
 よろしくお願いします。
<!DOCTYPE html>
<html>
<head>
<title>P262 Sample8-4 コンストラクタとクラスの変数</title>
</head>
<body>

<?php

$pr1 = new Person("鈴木",56);
$pr2 =...続きを読む

Aベストアンサー

できればクラスの宣言は上部にもっていくか、別ファイルにわけてincludeします
あとは表示部分はひとまとめにしたほうがいいでしょう

<?php
class Person
{
public static $count = 0;
public function __construct($nm,$ag){
person::$count++;
$this->name = $nm;
if($ag>=20 && $ag<=60){
$this->age = $ag;
}
else
$this->age = -1;
}
public function getname(){
return $this->name;
}
public function getage(){
return $this->age;
}
}


$pr1 = new Person("鈴木",56);
$pr2 = new Person("佐藤",38);


$table=<<<eof
<tr>
<td>{$pr1->getname()}</td>
<td>{$pr1->getage()}</td></tr>
<tr>
<td>{$pr2->getname()}</td>
<td>{$pr2->getage()}</td>
</tr>
eof;

$goukei=<<<eof
<hr>
合計人数:
eof;
$goukei.=Person::$count;

print <<<eof
<!DOCTYPE html>
<html>
<head>
<title>P262 Sample8-4 コンストラクタとクラスの変数</title>
</head>
<body>
<table border="2">
<tr bgcolor="#AAAAAA">
<th>名前</th>
<th>年齢</th>
</tr>
{$table}
</table>
{$goukei}
</body>
</html>
eof;
?>

できればクラスの宣言は上部にもっていくか、別ファイルにわけてincludeします
あとは表示部分はひとまとめにしたほうがいいでしょう

<?php
class Person
{
public static $count = 0;
public function __construct($nm,$ag){
person::$count++;
$this->name = $nm;
if($ag>=20 && $ag<=60){
$this->age = $ag;
}
else
$this->age = -1;
}
public function getname(){
return $this->name;
}
public function getage(){
return $this->age;
}
}


$pr1 = ...続きを読む

QPHP

https://oshiete.goo.ne.jp/qa/9754368.html の回答や
https://oshiete.goo.ne.jp/qa/7180158.html
を見てPHPを始めましたが、
C:\MAMP\htdocs\a.html→Error 404
http://localhost:8888/MAMP/→Error 404
いずれも存在するファイル
xamppも入っています。

その他何が必要な情報なのかわからないので
必要な情報があれば返信してください。

Aベストアンサー

前回と同じ回答者です。
XAMPPだけでいいです。
ちなみにXAMPPはテストに使うだけですよ。
環境構築できないのなら、PHPを動かせるサーバを借りて、そこにアップして試せば良いだけです。

アルバムは無事、書き出せましたか??
分からない問題は、一つ一つ解決していかなければ、前に進めませんよ。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報