チェックボックスのvalueを「<?php print_r($item); ?>」として、b.phpにて「$item_array=$_POST["chk"];」で受け取ろうとしましたが上手くいきません。a.phpとb.phpのファイルをどう書けばよいか、教えてください。
a.phpのコード
<?php
$item_array[0]['a'] = "a";
$item_array[0]['b'] = "111.jpg";
$item_array[1]['a'] = "c";
$item_array[1]['b'] = "222.jpg";
?>
<form action="b.php" method="POST">
<table>
<?php foreach($item_array as $item){ ?>
<tr>
<td><input type="checkbox" name="chk[]" value="<?php print_r($item); ?>"></td>
<td><a href="<?php echo $item['a']; ?>"><img src="<?php echo $item['b']; ?>"></a></td>
</tr>
<?php } ?>
</table>
<input type="submit" name="submit" value="絞り込み">
</form>
b.phpのコード
<?php
$item_array=$_POST["chk"];
?>
<table>
<?php foreach($item_array as $item){ ?>
<tr>
<td><a href="<?php echo $item['a']; ?>"><img src="<?php echo $item['b']; ?>"></a></td>
</tr>
<?php } ?>
</table>
a.phpのコード
<?php $item_array[0]['a'] = "a"; $item_array[0]['b'] = "111.jpg"; $item_array[1]['a'] = "c"; $item_array[1]['b'] = "222.jpg"; // セッションの開始 session_start(); // 格納 $_SESSION["item_array"] = $item_array; ?> <form action="b.php" method="POST"> <table> <?php $ct=0; ?> <?php foreach($item_array as $item){ ?> <?php $ct++; ?> <tr> <td><input type="checkbox" name="chk[]" value="<?php print($ct); ?>"></td> <td><a href="<?php echo $item['a']; ?>"><img src="<?php echo $item['b']; ?>"></a></td> </tr> <?php } ?> </table> <input type="submit" name="submit" value="絞り込み"> </form>
b.phpのコード
<?php $chk_array=$_POST["chk"]; $item_array = $_SESSION["item_array"]; ?> <table> <?php foreach($chk_array as $chk){ ?> <tr> <td><a href="<?php echo $item_array[$chk]['a']; ?>"><img src="<?php echo $item_array[$chk]['b']; ?>"></a></td> </tr> <?php } ?> </table>
HTML にはプログラム要素を望んでるような書き方になってるため、そこで詰まってる気がします。
name="chk[]" の部分は name="chk[0][a]" の用に書く必要があります。
b.php の方で
$array_1st = array('0', '1', '2', 以下略);
$array_2nd = array('a', 'b', 'c', 以下略);
の様にして、
for($i = 0; $i < count($array_1st); $i++){
for($j = 0; $j < count($array_2nd); $j++){
print $_POST["chk[$i][$j]"];
}
}
とすれば、全ての値を得られるかなと思います。
上のサンプルの print $_POST["chk[$i][$j]"] の部分で、内部で扱うようの配列を組み上げ、
それを利用すればいいかと思います。
回答ありがとうございます。「name="chk[]" の部分は name="chk[0][a]" の用に書く必要があります。」とありますが、今回サンプルとして少ないデータで配列を書きましたが、実際は[0]の部分も[a]の部分もたくさんあります。そういった場合には具体的にコードはどのように書けばよろしいでしょうか?引き続き教えていただけないでしょうか?
【1】原因の見つけ方の例
b.phpがどのような値を受け取っているかを確認する(print_rでは構造までは示してくれないので、この場合には不適です)
<?php $item_array = $_POST["chk"]; var_dump($item_array); ?>
出力結果を見れば配列ではなく文字列として渡されてしまっていることがわかると思います
array(2) { [0]=> string(45) "Array ( [a] => a [b] => 111.jpg )" [1]=> string(45) "Array ( [a] => c [b] => 222.jpg )" }
どうしてAになるのかという点については、phpのあいまいさによって$item['a']とした場合には$item[0]と見なされてしまうことが原因となっています
b.phpで下記のようにしてみると判りやすい結果が現れることでしょう
<?php echo $item[0], $item[1], $item[2], $item[3], $item[4]; ?><a href="<?php echo $item['a']; ?>"><img src="<?php echo $item['b']; ?>"></a>
【2】対処例
(1)文字列として結合・分解する方法
a.phpの変更点(カンマで連結)
<td><input type="checkbox" name="chk[]" value="<?php echo join(',', $item); ?>"></td>
b.phpの変更点(カンマで分解)
<?php $temp=str_split(',', $item); ?> <a href="<?php echo $temp[0]; ?>"><img src="<?php echo $temp[1]; ?>"></a>
http://jp2.php.net/manual/ja/function.implode.php
http://jp2.php.net/manual/ja/function.str-split.php
(2)シリアライズして配列のまま渡す方法
a.phpの変更点(シリアライズしたものをhttpで渡せるようにBASE64でエンコード)
<td><input type="checkbox" name="chk[]" value="<?php echo base64_encode(serialize($item)); ?>"></td>
b.phpの変更点(逆の手順で元に戻す:BASE64でデコードしてからアンシリアライズ)
<?php $temp=unserialize(base64_decode($item));?> <a href="<?php echo $temp['a']; ?>"><img src="<?php echo $temp['b']; ?>"></a>
回答ありがとうございます。二つとも試してみましたがエラーが出てしまいます。a.phpはvalueの中を指示通り変えました。b.phpは
$item_array=unserialize(base64_decode($temp)); ?>
のように変えましたが、(1),(2)どちらでも「Warning: base64_decode() expects parameter 1 to be long, array given in C:\xampp\htdocs\b.php on line 3」というメッセージが出ます。引き続き教えていただけないでしょうか?
<input type="checkbox" name="chk[]" value="行数" ?>">
a.phpで商品一覧を生成するときに、セッション変数に配列の形で情報をまるまる抱え込むのがよいです。
で、b.phpには行数を渡せば、b.phpでセッション変数から行数に該当する分を取り出せばよいだけになるので
非常に簡単になります。
PHPなどのセッション変数を使える言語では通常このようなやり方が主流です。
また、シンプルですので作りやすいです。
こういうんは一般的な定型処理ですので、書店などでPHPのサンプル集などを流し読みして
作りたいものに近いものを選んで買ってきてまねるほうがずーっとよいです。
上記の回答者さんのやり方でもできますが、初心者にはお勧めしませんし、またプロもそういうやり方をあまりしません。
セッション変数を使えない言語や使えなかった時代に生み出された手法です。
回答ありがとうございます。セッション変数で一度やってみようと試みたんですが、うまくいきませんでした。「b.phpには行数を渡せば」と、私も同じように考えたのですが、具体的にvalueの中をどうするかがわかりませんでした。もう少しa.phpとb.phpの具体的なコードを教えていただけないでしょうか?引き続き教えてください。
a.phpのコード
<?php $item_array[0]['a'] = "a"; $item_array[0]['b'] = "111.jpg"; $item_array[1]['a'] = "c"; $item_array[1]['b'] = "222.jpg"; // セッションの開始 session_start(); // 格納 $_SESSION["item_array"] = $item_array; ?> <form action="b.php" method="POST"> <table> <?php $ct=0; ?> <?php foreach($item_array as $item){ ?> <?php $ct++; ?> <tr> <td><input type="checkbox" name="chk[]" value="<?php print($ct); ?>"></td> <td><a href="<?php echo $item['a']; ?>"><img src="<?php echo $item['b']; ?>"></a></td> </tr> <?php } ?> </table> <input type="submit" name="submit" value="絞り込み"> </form>
b.phpのコード
<?php $chk_array=$_POST["chk"]; $item_array = $_SESSION["item_array"]; ?> <table> <?php foreach($chk_array as $chk){ ?> <tr> <td><a href="<?php echo $item_array[$chk]['a']; ?>"><img src="<?php echo $item_array[$chk]['b']; ?>"></a></td> </tr> <?php } ?> </table>
ありがとうございます!指示通りのコードでできました!
ありがとうございます!指示通りのコードでできました!