授業の課題で、  
三つの文字列を連想配列に代入し、foreach文で表示したものをwhile文で実現させる  
というものがありました。

これはwhile文を回すために新しく変数を作るということでしょうか？  
調べたり教科書を見たりしていますが、発想力が乏しいもので...

while文で作るヒントを教えてください。

よろしくお願いします。

* * *

（追記）  
ヒントなのか正解なのか紛らわしい表現になってしまいすみません。  
できれば答えを知りたいのですが、ヒントをみて自分で書けるものなら書きたかったので答えもヒントも求めているような文になってしまいました。

foreach文のものは以下です。

```

    <?php
        $data = array("ringo" => "りんご", "banana" => "バナナ", "suika" => "スイカ");
    
        foreach($data as $test)
        {
            print $data;
        }
    ?>
    
```

よろしくお願いします。
CC BY-SA 3.0
2016-05-30T08:23:29.570
25295
2016-06-01T10:07:24.587
2016-06-01T10:07:24.587
15700
question
php
PHPの連想配列をwhile文で表示
```

    $array = Array('tokyo' => '東京', 'kyoto' => '京都', 'osaka' => '大阪');
    
    foreach($array as $key => $value){
        print $key . ':' . $value . PHP_EOL;
    }
    
```

上記のような`foreach`を`while`に以下のように書き直すことができます。

```

    #foreach に続けてwhileで表示する場合にはresetが必要
    #reset($array);
    
    while (list($key, $value) = each($array)) {
        print $key . ':' . $value . PHP_EOL;
    }
    
```

他の方法で

```

    while ($value = current($array)) {
        print key($array) . ':' . $value . PHP_EOL;
        next($array);
    }
    
```

のようにもできます。(さらに他の方法もあるかと思いますが）

キーと値の両方が必要かどうかわからなかったので両方使う例(foreachも)書いてみました。
CC BY-SA 3.0
2016-05-30T09:03:52.783
25300
2016-05-30T09:03:52.783
5044
25295
answer
出題の意図としては、変数をつくることよりも、同じループを異なる書き方で表現して、どちらのほうが読みやすいのかを考えたり、自分のことばで表現することではないかと思います。

いろいろな書き方を試して、より多くの人に伝わりやすい表現とは何かということを考えるための練習と言い換えることができます。このように、出力結果を同じように保ちながら、コードの読みやすさや処理速度を改善する作業を「リファクタリング」と呼びます。

`while`
文をまったく書いたことがないのであれば、配列を表示する前に、1から10までの数値を表示するコードから取り組むのはいかがでしょうか。公式マニュアルにコードの例が記載されています。

```

    <?php
    // http://php.net/manual/ja/control-structures.while.php
    // PHP_EOL は定数で改行コード
    
    $i = 1;
    while ($i <= 10) {
        echo $i++, PHP_EOL;
    }
    
```

`while` ループを使う場合、最初の段階ではポインタを使ったやり方よりも変数 (`$i`) を明確に用意するほうがわかりやすいと思います。

一般的に、与えられた問題が解けないのであれば、問題を単純にしたり、分解したりして、自分が解けるレベルに下げることから始めます。

入力に慣れていないなら、確実に動くことが期待されるコードをコピペして、使っているパソコンで動くことを確認してから、改めて自分の手で入力して動くことを確認すると時間の節約になるかもしれません。

MIT
の大学の先生によれば、プログラミングの学習の大半は、ライブラリのマニュアルを読み、どのように組み合わせれば目的が達成できるのかを把握することに費やされており、プログラムを書くとは、『ライブラリ
(コードの集まり) を持ち寄って、突っつき回して、どのように動作するかを観察する。そして、「目的を達成するために改造できるのか」を考える』とのことです
([MITがSICPを教えなくなった理由](http://cpplover.blogspot.jp/2016/05/mitsicp.html))。
CC BY-SA 3.0
2016-05-31T16:45:16.737
25346
2016-05-31T16:45:16.737
568
25295
answer