1

動作する次のphpコードがありますが、長すぎて読むのが面倒です...

// get the row
 if ($taktArticle[0]['t1position3'] > 3 AND $taktArticle[0]['t1position3'] < 7  ) {
   $row = "row1";
 }

 if ($taktArticle[0]['t1position3'] > 7 AND $taktArticle[0]['t1position3'] < 12  ) {
   $row = "row2";
 }

 if ($taktArticle[0]['t1position3'] > 12 AND $taktArticle[0]['t1position3'] < 17  ) {
   $row = "row3";
 }

 if ($taktArticle[0]['t1position3'] > 17 AND $taktArticle[0]['t1position3'] < 22  ) {
   $row = "row4";
 }

 if ($taktArticle[0]['t1position3'] > 22 AND $taktArticle[0]['t1position3'] < 27  ) {
   $row = "row5";
 }

 // get the columns
 if ($taktArticle[0]['t1position3'] == 3 
     or $taktArticle[0]['t1position3'] == 8 
     or $taktArticle[0]['t1position3'] == 13 
     or $taktArticle[0]['t1position3'] == 18 
     or $taktArticle[0]['t1position3'] == 23) {

   $col = "col1";
 }  

 if ($taktArticle[0]['t1position3'] == 4 
     or $taktArticle[0]['t1position3'] == 9 
     or $taktArticle[0]['t1position3'] == 14 
     or $taktArticle[0]['t1position3'] == 19 
     or $taktArticle[0]['t1position3'] == 24) {

   $col = "col2";
 }

 if ($taktArticle[0]['t1position3'] == 5 
     or $taktArticle[0]['t1position3'] == 10 
     or $taktArticle[0]['t1position3'] == 15 
     or $taktArticle[0]['t1position3'] == 20 
     or $taktArticle[0]['t1position3'] == 25) {

   $col = "col3";
 }

 if ($taktArticle[0]['t1position3'] == 6 
     or $taktArticle[0]['t1position3'] == 11 
     or $taktArticle[0]['t1position3'] == 16 
     or $taktArticle[0]['t1position3'] == 21 
     or $taktArticle[0]['t1position3'] == 26) {

   $col = "col4";
 }

 if ($taktArticle[0]['t1position3'] == 7 
     or $taktArticle[0]['t1position3'] == 12 
     or $taktArticle[0]['t1position3'] == 17 
     or $taktArticle[0]['t1position3'] == 22 
     or $taktArticle[0]['t1position3'] == 27) {

   $col = "col5";
 }

さて... これを ($taktArticle[0]['t1position3'] から ($taktArticle[0]['t1position11']) まで繰り返さなければなりません

ご存じのとおり、コードは巨大になります...このコードを短縮する方法を知っている人はいますか?

よろしく、ジョン

4

8 に答える 8

2

コードをクリーンアップする関数を作成できます。コードには明らかなパターンがあり、それらのパターンを探し、それらのパターンを一般化することは、コードをクリーンアップするための重要な要件です。PHP の第一人者であれば、これを達成するためのより簡潔な方法を見つけることができると確信していますが、基本的な例は次のようなものです。

function get_row($position) {
  $row_ranges = array(
    array(3, 7),
    array(7, 12),
    // etc
  );     

  foreach ($row_ranges as $row_index => $range) {
    if ($range[0] < $position && $position < $range[1]) {
       return sprtintf('row%s', $row_index + 1)
    }
  }

}

すべての行範囲は関数内の一元化された場所に保持され、繰り返される条件はもうありません

function get_column($value) {
  // looks like you are starting at 3 and have increments of 5 
  // 3, 8, 13, 18
  // you could loop through and calculate these, or hardcode them in
  //  use `in_array` to clean up the multiple or statements
  if (in_array($value, array(3, 8, 13, 18))) {

  }
}
于 2013-09-24T15:04:37.763 に答える
1

私の考えは、配列を作成してそれを調べることです:

$rowtbl = array(4 => 1, 1, 1, 8 => 2, 2, 2, 2);
$row = 'row'.$rowtbl[$taktArticle[0]['t1position3']];

もちろん、配列は大きくなる可能性がありますが、array_merge と範囲から何かを構築できます。

さらに、次のようなことができるように思えます。

$row = ceil(($taktArticle[0]['t1position3']-3)/5);
$col = ($taktArticle[0]['t1position3']-3)%5;

3 と 5 の正確なパラメーターを確認する必要があります (3 が開始点で、5 が行あたりの列数になります。

于 2013-09-24T15:03:43.670 に答える
1

OR列セクションでは、いくつかの演算子を結合するのではなく、$taktArticle[0]['t1position3']値が配列に存在するかどうかを確認できます。

たとえば、PHP in_array( http://php.net/manual/en/function.in-array.php ) を使用します。

if(in_array($taktArticle[0]['t1position3'], [3, 8, 13, 18, 23])) {
    $col = "col1";
}

これはきれいですが、このマッピングのすべての値をハードコーディングしているため、新しいケースを追加するとメンテナンスのオーバーヘッドが大きくなります。

于 2013-09-24T15:15:38.963 に答える
1

使用できます

if(in_array($taktArticle[0]['t1position3'],array(7,12,17,22,27)))

この種の声明の代わりに

if ($taktArticle[0]['t1position3'] == 7 
OR $taktArticle[0]['t1position3'] == 12 
OR $taktArticle[0]['t1position3'] == 17 
OR $taktArticle[0]['t1position3'] == 22 
OR $taktArticle[0]['t1position3'] == 27)
于 2013-09-24T15:07:46.147 に答える
1

クリストフによる最初の部分での良い答えはすでにあります。

列に関しては、IF 内の複数の比較の代わりに、 を使用しますin_array

さて... これを ($taktArticle[0]['t1position3'] から ($taktArticle[0]['t1position11']) まで繰り返さなければなりません

そのような最適ではないデータ構造を選択したあなたの責任です。

位置を簡単にループできるよう$taktArticle[0]['t1position'][3]に、このデータが に整理されていないのはなぜですか …?$taktArticle[0]['t1position'][11]

(そして、 の類似物がt1positionある場合はt2positiont3positionなどもあります。それらも配列に編成する必要があります。)

于 2013-09-24T15:07:02.413 に答える
0

そこにはパターンがあるため、配列の代わりに除算を使用できます。

$temp = $taktArticle[0]['t1position3']-2
if($temp%5 != 0){
  $row = "row".ceil(($taktArticle[0]['t1position3']-2)/5);
}
$col = "col".(($taktArticle[0]['t1position3']-2)%5);
于 2013-09-24T15:13:59.443 に答える