0

データベースからの2つの配列を利用可能な布のサイズとデフォルトのサイズと比較する必要があります

$sizedefault = array('s','m','l','xl','xxl','xxxl','xxxxl','xxxxxl'); // Default Sizes
$sizeavailable = explode(',',$pd_size);    // Available Sizes (db) s,m,l,xl

$available = array_diff($sizedefault , $sizeavailable );
$notavailable = array_intersect($sizeavailable , $sizedefault);
$output = "";
foreach ($notavailable as $value){
$output .= "<input type=\"checkbox\" name=\"size[]\" id=\"$value\" value=\"$value\" checked=\"checked\"/><label for=\"$value\">".$value."</label>";

}
foreach($available as $value){
$output .= "<input type=\"checkbox\" name=\"size[]\" id=\"$value\" value=\"$value\" /><label for=\"$value\">".$value."</label>";
}

これまでのところ機能しますが、たとえば「xxxxl」をチェックして送信/要求した後、出力はソートされません。

この結果が得られます:(x)=チェック済み

s(x)m(x)l(x)xl(x)xxxxl(x)xxxxxl()xxl()

どうすればそれらを並べ替えておくことができ$sizedefaultますか?

s(x)m(x)l(x)xl(x)xxl()xxxxl(x)xxxxxl()

4

1 に答える 1

1

これらの配列を事前に構築する必要はありませんin_array()。ループの実行中に可用性配列に値が存在するかどうかを確認するために使用できます。また、チェックボックスの HTML コードを複製する必要がないため、より優れています。唯一の違いは、の存在であり、checked="checked"条件付きで追加できます。

$sizedefault = array('s','m','l','xl','xxl','xxxl','xxxxl','xxxxxl'); // Default Sizes
$sizeavailable = explode(',',$pd_size);    // Available Sizes (db) s,m,l,xl

$output = "";
foreach ($sizedefault as $value){
    $checked = in_array($value, $sizeavailable) ? ' checked="checked"' : '';
    $output .= "<input type=\"checkbox\" name=\"size[]\" id=\"$value\" value=\"$value\" $checked /><label for=\"$value\">".$value."</label>";
}

$sizedefault外部ソース (ユーザー、Cookie など) から取得した場合、またはデータベースに保存する前に外部ソースから取得した場合は、HTML に出力する前にその中の値もエスケープする必要があります。でそれを行うことができますhtmlspecialchars()。そうしないと、HTML にスクリプトを挿入できてしまいます。

foreach ($sizedefault as $value){
    $checked = in_array($value, $sizeavailable) ? ' checked="checked"' : '';
    $value = htmlspecialchars($value);
    $output .= "<input type=\"checkbox\" name=\"size[]\" id=\"$value\" value=\"$value\" $checked /><label for=\"$value\">".$value."</label>";
}
于 2012-08-29T09:51:00.297 に答える