重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になっております。

URLに動的に引数を渡したいのですが、効率のよい方法が思いつきません。


<a href="/?1=1<?($id)?'&id='.$id:'')?><?($page>0)?'&page='.$page+1:'')?>&sort=created">最新順</a>
<a href="/?1=1<?($id)?'&id='.$id:'')?><?($page>0)?'&page='.$page+1:'')?>&sort=popular">人気順</a>
<a href="/?1=1<?($id)?'&id='.$id:'')?><?($page>0)?'&page='.$page+1:'')?>&sort=comment">コメント順</a>

このように見づらいコードになってしまいます。
みなさんはどのような方法で解決されているでしょうか?

A 回答 (4件)

これは、HTMLのタグの中にPHPのタグを埋め込もうとするから見栄えが厳しくなるということであれば、


はなから、aタグを生成する関数を作れば良いのではないですか?

<?php
function a_href($title, $url, $id, $page=0, $options=array(), $attributes=array()){
$tag = '<a href="%s"%s>%s</a>';
if(!preg_match('/^[0-9]+$/', $page)){
$page = 0;
}
$page++;
$page_and_id = array();
if($id) $page_and_id['id'] = $id;
$page_and_id['page'] = $page;
$options = array_merge($page_and_id, $options);
$get_query = http_build_query($options, '', '&');
if(strpos($url, '?') !== false){
$get_query = '&' . $get_query;
}else{
$get_query = '?' . $get_query;
}
$str_attr = '';
foreach($attributes as $attr=>$val){
$str_attr .= ' '.$attr.'="'.$val.'"';
}

return sprintf($tag, $url.$get_query, $str_attr, $title);

}

?>
<?php echo a_href('最新順', '/?1=1', 1, 0, array('sort'=>'created'))?>
<?php echo a_href('人気順', '/?1=1', 1, 0, array('sort'=>'popular'))?>
<?php echo a_href('コメント順', '/?1=1', 1, 0, array('sort'=>'comment'))?>

と、適当にでっちあげてみましたが、いかがでしょう。
    • good
    • 0

とりあえず関数にまとめちゃうとか・・・



<?PHP

function setArgs($args = NULL){
$id=$_REQUEST["id"];
$pattern="/^[0-9a-z]+$/i";
if(preg_match($pattern,$id)) $args["id"]=$id;
$page=$_REQUEST["page"];
if(!is_numeric($page)) $page=0;
$args["page"]=$page +1;
$str="";
foreach($args as $key=>$val){
if($str!="") $str.="&";
$str.=$key."=".$val;
}
if($str!="") $str="?".$str;
return $str;
}

print "<a href=\"".setArgs(array("sort"=>"created"))."\">最新順</a><br>\n";
print "<a href=\"".setArgs(array("sort"=>"popular"))."\">人気順</a><br>\n";
print "<a href=\"".setArgs(array("sort"=>"comment"))."\">コメント順</a><br>\n";
?>

この仕様ってページが毎回インクリメントされちゃいますがほんとにいいのでしょうか?

この回答への補足

ありがとうございます。

こちらの方法もいい方法ではないかと考えました。
ただ要素が多くなるとかなり見づらいきがします。

あと↓みたいな関数があるので自作しないでも行けます。
<?=http_build_query(array("sort"=>"created"))?>

補足日時:2011/01/25 17:53
    • good
    • 0

あ~、なるほどね。

最後の括弧が余計なのね。と気がついた所で俺なら とりあえず、こう書きます。

<?
$id02 = ($id) ? '&id=' . $id : '';
$page02 = ($page > 0) ? '&page=' . ($page + 1) : '';
$mix = $id02 . $page02;
print<<<EOL
<a href="/?sort=created{$mix}">最新順</a>
<a href="/?sort=popular{$mix}">人気順</a>
<a href="/?sort=comment{$mix}">コメント順</a>
EOL;
?>

この回答への補足

文のミス指摘ありがとうございます。

私もbm_hiroさんがご教示いただいた方法が一番良いのではないかと思っておりますが、膨大なリンクがある場合、コントローラー(プログラム部分)がかなり見づらくなってしまいます。

例としてあげたものはソートリンクだけですが、ソートした要素へのリンクやトップへの戻るリンクにidやセッションIDをつけたい場合、もっといい方法はないものだろうかと思案しております。

$id02 = ($id) ? '&id=' . $id : '';
$page02 = ($page > 0) ? '&page=' . ($page + 1) : '';
$mix = $id02 . $page02;
$pmix = $id02;

<a href="/params/1<?=$pmix?>">ほげほげ</a>

<a href="/<?=$pmix?>">TOPへ</a>

補足日時:2011/01/25 17:51
    • good
    • 0

んー。

。。???

俺が無知なだけだと思うのですが、これって、PHPのソースとして 成立してるんでしょうか??

三項演算子を使ってるのだとは思いますが、試しに、<?($id)?'&id='.$id:'')?> だけ実行したら パースエラー出ました。
    • good
    • 0

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