【问题标题】:Create / add up array with switch statements使用 switch 语句创建/累加数组
【发布时间】:2011-12-19 14:14:04
【问题描述】:

出于可读性和性能的原因,我想使用 switch 语句而不是 if-statements 构建一个数组。

考虑以下 if 语句:

$size = 2;
$array = array();
if($size >= 1) { array_push($array,'one','foo'); }
if($size >= 2) { array_push($array,'two','bar','barista'); }
if($size >= 3) { array_push($array,'three','zoo','fool','cool','moo'); }

它基本上从1 计数到$size,它可能更具可读性,并且很可能使用 switch-statment 更快...但是你如何构造它??

$step = 2;
$array = array();
switch($step)
{
    case ($step>1): array_push($array,'one','foo');
    case ($step>2): array_push($array,'two','bar','barista');
    case ($step>3): array_push($array,'three','zoo','fool','cool','moo');
}

我尝试省略 break,但没有用 - 正如手册所述:

在 switch 语句中,条件只计算一次[...]。 PHP 继续执行语句直到 switch 结束 块,或者它第一次看到一个 break 语句。

无论如何,有人知道如何使用switch-statement 构建这样的数组吗??

【问题讨论】:

  • 使用您编写的代码,在任何情况下您都将在第一个 if 语句中输入,因为如果您的 size=2 或 3 或更大,第一个 if 将为真。你为什么不做一些更简单的事情,比如: $array[] = $size;而不是那些 if?
  • @Marco Pace 数组的内容只是一个例子,实际上我里面还有其他的值...我会改变我的例子,让它更清楚...
  • $size = 3+ 将匹配所有条件。 $size = 2 将匹配条件 1 和 2。$size = 1 将仅匹配条件 1,$size = 0 将不匹配任何条件。这是你想要的吗?

标签: php arrays if-statement switch-statement


【解决方案1】:

当然,你想要的可以更容易地实现

$array=range(1,$size);

根据进一步的评论和随后的编辑,类似于:

$baseArray = $array(array('one'),
                    array('two','twoA'),
                    array('three','threeA','threeB'),
                    array(),
                    array('five'),
                   );
$step=2;
$array = array_slice($baseArray,0,$step);

然后展平$array

【讨论】:

  • 进一步澄清了我想要的数组结果,请参阅我的问题的评论部分!我想要一些动态值,而不是数组中的数字。很抱歉造成混乱
  • 我今天遇到了一些问题要表达自己:D 我还有一些变量,而不仅仅是每个案例 1 个 - 有时 1 个,有时 3 个。将再次重新编辑以进一步澄清。
  • 现在这就是我想要的,干得好,它甚至不是任何条件语句或循环,所以我只是假设它更快 - 如果我错了,请告诉我!非常感谢您的耐心等待!
  • 你需要一个循环来将数组展平为一个直的一维数组,但是在php.net/manual/en/function.array-values.php 上给出了很多这样的例子(包括使用像 array_walk_recursive() 这样的高效函数作为循环函数......所以它应该比 ifs 或 case 更有效
【解决方案2】:

嗯,一个 switch 语句应该是这样的:

编辑:以上不起作用 - 让我看看。

但在这个例子中,你可以这样做:

$size = 2;
$array = range(1, $size); // Array ( [0] => 1 [1] => 2 )

【讨论】:

  • 在您的 switch 语句中,我不会添加一个数组,因为如果是 $size = 2,它将在第一个语句之后停止 (break)!第二个,请看我对我问题的cmets的回复
【解决方案3】:
$valuesIWant = array(1=>'one','two','three','four');
$array = array();
for ($i = $step - 1; $i > 0; $i--) $array[] = $valuesIWant[$i];
$array = array_reverse($array);

所以如果$step 是 2,你会得到:

Array
(
    [0] => one
)

...如果是 4,你会得到:

Array
(
    [0] => one
    [1] => two
    [2] => three
)

【讨论】:

  • 我明白你在做什么,这个想法很好 (+1),虽然它不完全适合我的情况,因为我在每种情况下都有不同数量的变量。马克贝克同时完善了这个想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多