PHPの配列をテーブルで一覧表示し、テーブル表の一番左にチェックボックスを作り、チェックを入れて「絞り込み」ボタンをクリックして絞り込みをさせるためのa.phpファイルと、そのチェックと同じ行のデータのみのテーブルを表示させるb.phpファイルを作りました。

チェックボックスの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>

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2011/03/01 16:57:10
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:chinchin-kozou No.4

回答回数198ベストアンサー獲得回数7

ポイント30pt

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> 

id:himejiblog

ありがとうございます!指示通りのコードでできました!

2011/03/01 16:45:16

その他の回答3件)

id:niwa-mikiho No.1

回答回数516ベストアンサー獲得回数40

ポイント15pt

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]"] の部分で、内部で扱うようの配列を組み上げ、

それを利用すればいいかと思います。

id:himejiblog

回答ありがとうございます。「name="chk[]" の部分は name="chk[0][a]" の用に書く必要があります。」とありますが、今回サンプルとして少ないデータで配列を書きましたが、実際は[0]の部分も[a]の部分もたくさんあります。そういった場合には具体的にコードはどのように書けばよろしいでしょうか?引き続き教えていただけないでしょうか?

2011/03/01 09:18:29
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント23pt

【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>

http://www.php.net/manual/ja/function.serialize.php

http://www.php.net/manual/ja/function.base64-encode.php

id:himejiblog

回答ありがとうございます。二つとも試してみましたがエラーが出てしまいます。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」というメッセージが出ます。引き続き教えていただけないでしょうか?

2011/03/01 09:15:45
id:taroe No.3

回答回数1099ベストアンサー獲得回数132

ポイント22pt

<input type="checkbox" name="chk[]" value="行数" ?>">

a.phpで商品一覧を生成するときに、セッション変数に配列の形で情報をまるまる抱え込むのがよいです。

で、b.phpには行数を渡せば、b.phpでセッション変数から行数に該当する分を取り出せばよいだけになるので

非常に簡単になります。

PHPなどのセッション変数を使える言語では通常このようなやり方が主流です。

また、シンプルですので作りやすいです。

こういうんは一般的な定型処理ですので、書店などでPHPのサンプル集などを流し読みして

作りたいものに近いものを選んで買ってきてまねるほうがずーっとよいです。

上記の回答者さんのやり方でもできますが、初心者にはお勧めしませんし、またプロもそういうやり方をあまりしません。

セッション変数を使えない言語や使えなかった時代に生み出された手法です。


PHPによるWebアプリケーションスーパーサンプル 第2版
西沢 直木
479733245X

id:himejiblog

回答ありがとうございます。セッション変数で一度やってみようと試みたんですが、うまくいきませんでした。「b.phpには行数を渡せば」と、私も同じように考えたのですが、具体的にvalueの中をどうするかがわかりませんでした。もう少しa.phpとb.phpの具体的なコードを教えていただけないでしょうか?引き続き教えてください。

2011/03/01 09:34:21
id:chinchin-kozou No.4

回答回数198ベストアンサー獲得回数7ここでベストアンサー

ポイント30pt

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> 

id:himejiblog

ありがとうございます!指示通りのコードでできました!

2011/03/01 16:45:16
  • id:himejiblog
    id:windofjuly さんより訂正と補足を頂きました。ご丁寧にありがとうございました。
    http://d.hatena.ne.jp/windofjuly/20110301/1298985028

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません