【问题标题】:PHP - counting an imploded arrayPHP - 计算内爆数组
【发布时间】:2014-10-20 21:06:56
【问题描述】:

我正在尝试使用sizeofcount 来返回数组中的事物数量,但是每当我使用$rank_ids2 来计数而不是手动输入1, 2, 3, 4, 67, 7 时,它只会返回1 ,但是当我直接在数组中键入它们时,它计数为 6 就好了!

$ranksAllowed = '|1|2|3|4|67|7|';

$rank_ids = explode('|', trim("|".$ranksAllowed."|", '|'));
$rank_ids2 = implode(", ", $rank_ids);

$arrayofallowed = array($rank_ids2);
echo sizeof($arrayofallowed);

$rank_ids 只是将 |1|2|.. 格式转换为 1, 2

【问题讨论】:

  • implode 返回一个字符串;它将数组转换为字符串。因此,如果您将该字符串放入一个新数组中,就像您所做的那样,您最终会得到一个包含一个元素的数组。
  • 如果您想计算有多少“等级”,请将您的计数移至 implode 和 count($rank_ids) 上方,同时它仍然是一个数组。您还可以使用 substr_count 来计算字符串中存在多少 , 并加 1。编辑:我想既然您将字符串分配给一个新变量,您可以只使用 count($rank_ids) 而无需将其移至内爆上方。跨度>

标签: php arrays explode implode


【解决方案1】:

我对您的问题的第一个解决方案是最初将 $ranksAllowed 定义为数组而不是管道字符分隔的字符串:

$ranksAllowed = array(1, 2, 3, 4, 67, 7);

这在几乎任何可预见的情况下都更有意义。 如果出于某种原因您宁愿将$ranksAllowed 保留为字符串...

一些简化

$rank_ids = explode('|', trim("|".$ranksAllowed."|", '|'));

可以简化为:

$rank_ids = explode('|', trim($ranksAllowed, '|'));

确定字符串或数组格式

现在看起来你正在尝试同时做两件事(但都没有实现)

一种可能性是您希望将竖线分隔的 ("|1|2|3|.​​..") 字符串转换为逗号分隔的字符串(如 "1, 2, 3, ...")。在这种情况下,您可以简单地进行字符串替换:

$commaDelimited = str_replace('|', ',', trim($ranksAllowed, '|'));

另一种可能性(我相信您正在寻找的可能性)是生成一个包含所有允许等级的数组,您已经在前面的步骤中完成了它,但分配给 $rank_ids 而不是 @987654328 @:

$arrayofallowed = explode('|', trim($ranksAllowed, '|'));

//Should print out data in array-format, like you want
print_r($arrayofallowed);

//Echo the length of the array, should be 6
echo count($arrayofallowed); 

【讨论】:

    【解决方案2】:

    implode 将数组转换为字符串,因此在完成所有操作后您会得到:

    • 名为$ranksAllowed 的字符串包含|1|2|3|4|67|7|
    • 一个名为 $rank_ids 的数组包含多个元素,分别是 12 等...
    • 名为$rank_ids2 的字符串包含1,2,3,4,67,7
    • 一个名为$arrayofallowed 的数组只有一个元素,即$rank_ids2 中的字符串

    要从|1|2|3|4|67|7| 获得包含1,2,3,4,67,7 的字符串,您可以像您一样修剪| 字符并将| 替换为,。 CPU 成本更低。

    $rank_ids2 = str_replace("|", ",", trim("|".$ranksAllowed."|", '|'));
    

    如果你想计算它们,你可以explode它并计算元素:

    $rank_ids2_array = explode(',', $rank_ids2);
    echo sizeof($rank_ids2_array);
    

    或者使用您的代码,您可以简单地计算已经爆炸的$rank_ids

    echo sizeof($rank_ids);
    

    【讨论】:

      【解决方案3】:

      尝试以下方法:

      $ranksAllowed = '|1|2|3|4|5|67|7|';
      $rank_ids = explode('|', trim($ranksAllowed, '|'));
      echo count($rank_ids);
      

      只是为了解释上面的内容,$arrayofallowed 是对 $rank_ids 数组的内爆,创建一个字符串。计算时,这不会给您预期的结果。如果您只计算 $rank_ids(因为 explode() 会给您留下一个数组),您应该会看到 7 个项目的预期结果。

      $rank_ids 是你的数组,$arrayofallowed 是一个字符串。

      有关更多信息,请参阅 PHP 手册中与 implode() 和 explode() 函数相关的部分。

      【讨论】: