是否有更紧凑和优雅的方式来编写此代码?

时间:2016-12-16 18:09:37

标签: php optimization

问题。

我喜欢简单优雅的代码,这感觉就像。第一个解决方案是粗略的。功能性和可能合理的性能但粗略。第二种是更优雅,但对于应该如此简单的东西来说似乎有些过分。

设置。

$recurring是一个包含大约20个项目的数组。我必须将这7个值(一周中的几天)映射到单个字段。使用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,
);

使用其他可选参数。

2 个答案:

答案 0 :(得分: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;
      }   
  }

for try 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;
      }   
  }

希望它有所帮助,祝你好运

答案 1 :(得分:0)

  

还有更好的主意吗?

这是否更好取决于口味,但至少有所不同:

$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,然后获取剩余的索引,即所需的天数。