【问题标题】:php foreach limit words for a menuphp foreach 限制菜单的单词
【发布时间】:2013-04-26 14:30:47
【问题描述】:

我有一些 html 菜单,最大宽度为 990px​​。现在我想从一个数组中打印这个菜单,并将这些菜单列表(<li>)放在一行中。删除填充空间或每个菜单列表,为了节省计算,如何将 foreach 中的总单词限制在 200 个字符内?我没有好主意,在我的代码中,将数组分组为字符串然后切割字符串长度,这不是一个好主意。

$a = array("item1","item2","item3" ... "item30");//'item' would be change to any other words.

foreach($a as $b){
   $c.=$b.'|';
}
function limitString($string, $limit = 200) {
    if(strlen($string) < $limit) {return $string;}
    $regex = "/(.{1,$limit})\b/";
    preg_match($regex, $string, $matches);
    return $matches[1];
}
$d = explode('|',limitString($c));
foreach($d as $e){
   echo '<li><a href="">'.$e.'</li>';
}

例如item20中的第200个字符,在item19中应该被打断,在这个foreach中输出19个菜单列表。

【问题讨论】:

  • 既然可以substr(),为什么还要使用正则表达式?你不需要火箭筒,唾液球也可以。
  • @Marc B,所以这不是一个好主意,有什么简单的方法吗?
  • 用 substr 吸出 200 个字符,然后从字符串的末尾向后扫描到第一个分隔符,切掉末尾的悬空位,最终得到一个非拆分子字符串。
  • 你想平等地限制每个单词吗?或者您想在达到 200 个字符时删除其余菜单?
  • @HamZa DzCyber​​DeV,当我达到 200 个字符时删除其余菜单

标签: php foreach


【解决方案1】:

您可以像其他 cmets 所说的那样使用 substr()。要保留单词拆分,请查看at this thread

不管怎样,有一个更好的方法来处理字符串的物理长度,但它涉及到 JavaScript。

您所要做的就是创建包含要测量的字符串的不可见 div,然后获取它的宽度和高度。为什么要这么做?当然,由于每个字母的宽度不同,不同操作系统上的不同浏览器也会以不同的方式显示字体。

【讨论】:

    【解决方案2】:

    尝试以下方法:

    $array = array("item1","item2","item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10", "item11", "item12", "item13", "item14", "item15", "item16", "item17", "item18", "item19", "item20", "item21", "item22", "item23", "item24", "item25", "item26", "item27", "item28", "item29", "item30", "item31", "item32", "item33", "item34", "item35", "item36", "item37", "item38", "item39", "item40", "item41", "item42", "item43", "item44", "item45", "item46", "item47", "item48", "item49", "item50", "item51", "item52", "item53", "item54", "item55", "item56", "item57", "item58", "item59", "item60", "item61", "item62", "item63", "item64", "item65", "item66", "item67", "item68", "item69", "item70", "item71", "item72", "item73", "item74", "item75", "item76", "item77", "item78", "item79", "item80", "item81", "item82", "item83", "item84", "item85", "item86", "item87", "item88", "item89", "item90", "item91", "item92", "item93", "item94", "item95", "item96", "item97", "item98", "item99", "item100");
    $max = 200;
    
    
    $length = 0;
    $menu_items = array();
    foreach($array as $value){
        $length += strlen($value);
        if($length <= $max){
            $menu_items[] = $value;
        }else{
            break;
        }
    }
    
    // Outputing the menu:
    echo '<ul><li>'. implode('</li><li>', $menu_items) .'</li></ul>';
    

    Online demo.

    【讨论】:

      【解决方案3】:

      你可以在这部分查看:

      foreach($a as $b){
      if(strlen($c)<200)  $c.=$b.'|'; else return;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-25
        相关资源
        最近更新 更多