人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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>

●質問者: himejiblog
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:.jpg PHP クリック コード チェックボックス
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● niwa-mikiho
●15ポイント

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]の部分もたくさんあります。そういった場合には具体的にコードはどのように書けばよろしいでしょうか?引き続き教えていただけないでしょうか?


2 ● うぃんど
●23ポイント

【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

◎質問者からの返答

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


3 ● taroe
●22ポイント

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

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

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

非常に簡単になります。

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

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

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

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

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

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


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

◎質問者からの返答

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


4 ● chinchin-kozou
●30ポイント ベストアンサー

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> 

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ