簡體   English   中英

有沒有更緊湊,更優雅的方式編寫此代碼?

[英]Is there a more compact and elegant way to write this code?

問題。

我喜歡簡單而優雅的代碼,但是感覺卻不一樣。 第一個解決方案是總的。 機能性強,可能表現合理但總體而言。 第二個比較優雅,但是對於應該這么簡單的東西似乎有點過分了。

設定。

$recurring是大約20個項目的數組。 我必須將這7個值(星期幾)映射到單個字段。 new_days = implode(',', $days);完成這兩項new_days = implode(',', $days); 或以數組形式使用它們,具體取決於調用此函數的位置。

嘗試1

  $days = array();
  if ($recurring['m'])
  {
    $days[] = 1;
  }
  if ($recurring['t'])
  {
    $days[] = 2;
  }
  if ($recurring['w'])
  {
    $days[] = 3;
  }
  if ($recurring['h'])
  {
    $days[] = 4;
  }
  if ($recurring['f'])
  {
    $days[] = 5;
  }
  if ($recurring['s'])
  {
    $days[] = 6;
  }
  if ($recurring['u'])
  {
    $days[] = 7;
  }

試試2

  $map = array(
    'm' => 1,
    't' => 2,
    'w' => 3,
    'h' => 4,
    'f' => 5,
    's' => 6,
    'u' => 7,
  );
  $days = array();
  foreach ($map as $offset => $value)
  {
    if ($recurring[$offset])
    {
      $days[] = $value;
    }
  }

還有更好的主意嗎?

編輯:其他信息

該數組如下所示:

$recurring = array(
  'id' => 27,
  'end_date' => '12-27-2005',
  'frequency' => 'W',
  'm' => 1,
  't' => 0,
  'w' => 1,
  'h' => 0
  'f' => 1,
  's' => 0,
  'u' => 0,
);

帶有其他可選參數。

您可以嘗試使用switch語句並在它們之間循環。

foreach($recurring as $key => $value){
      switch($key){
          case 'm':
            $days[] = 1;
            break;
          case 't':
            $days[] = 2;
            break;
          case 'w':
            $days[] = 3;
            break;
          case 't':
            $days[] = 4;
            break;
          case 'f':
            $days[] = 5;
            break;
          case 's':
            $days[] = 6;
            break;
          case 's':
            $days[] = 7;
            break;
      }   
  }

對於嘗試2:

foreach($recurring as $key => $value){
      switch($key){
          case 'm':
            $days[] = $value;
            break;
          case 't':
            $days[] = $value;
            break;
          case 'w':
            $days[] = $value;
            break;
          case 't':
            $days[] = $value;
            break;
          case 'f':
            $days[] = $value;
            break;
          case 's':
            $days[] = $value;
            break;
          case 's':
            $days[] = $value;
            break;
      }   
  }

希望對您有幫助,祝您好運

還有更好的主意嗎?

這是否更好取決於口味,但至少有所不同:

$recurring = array(
  'id' => 27,
  'end_date' => '12-27-2005',
  'frequency' => 'W',
  'm' => 1,
  't' => 0,
  'w' => 1,
  'h' => 0,
  'f' => 1,
  's' => 0,
  'u' => 0
);

$days = $recurring;
array_splice($days, 0, 3, 0);   # replace leading 3 elements by one element 0
$days = array_keys(array_filter(array_values($days)));

它將給定數組減少為天的元素(加上前導0以將想要的天數從1開始),更改索引的鍵,過濾元素以保留1 s,然后獲取其余的索引,即想要的天數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM