【问题标题】:Is there a more compact and elegant way to write this code?有没有更紧凑和优雅的方式来编写这段代码?
【发布时间】:2018-11-05 15:07:55
【问题描述】:

问题。

我喜欢简单而优雅的代码,这感觉不像。第一个解决方案很糟糕。功能性和可能合理的性能,但恶心。第二个更优雅,但对于应该如此简单的事情来说似乎有点过头了。

设置。

$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,
);

带有其他可选参数。

【问题讨论】:

  • 这应该进行代码审查。 codereview.stackexchange.com
  • @chris85 似乎有点傻。这是 stackoverflow 有标签的代码优化。
  • 我会尝试 2,使用 map
  • 删除了我的答案,祝你好运。

标签: php optimization


【解决方案1】:

您可以尝试使用 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;
      }   
  }

希望对你有帮助,祝你好运

【讨论】:

    【解决方案2】:

    有更好的想法吗?

    这是否更好是一个品味问题,但至少它是不同的:

    $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 开始的所需日期编号),将键更改为索引,过滤元素以保留 1s,并获取剩下的索引,就是想要的天数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2021-12-21
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多