【问题标题】:Split up Combined String into Array将组合字符串拆分为数组
【发布时间】:2011-09-24 17:19:02
【问题描述】:

我在这里问了一个关于合并商店营业时间相似的日子的问题

Combine days where opening hours are similar

现在我需要一些帮助来做相反的事情:获取包含组合日期的字符串并将它们拆分为单独的日子,然后按天的顺序将它们存储在一个数组中(星期一先,太阳最后)。

例如,这里有一组需要转换的字符串(格式完全相同):

Mon-Fri 11 am - 7:30 pm
Sat 11 am - 6 pm

两个字符串需要组合在一起,转换成这个数组:

array[0] = "11am - 7:30pm"
array[1] = "11am - 7:30pm"
array[2] = "11am - 7:30pm"
array[3] = "11am - 7:30pm"
array[4] = "11am - 7:30pm"
array[5] = "11am - 6pm"
array[6] = ""             // Blank value if the day Sunday is not in the set of strings that needs conversion
// ideally it should be an associative array, ie. array['mon'] = "11am - 7:30pm"

顺便说一句,我正在使用 Codeigniter PHP 框架和 jQuery。

更新:

我现在必须拆分这个包含逗号的文本字符串!

Mon 9 pm - 1 am
Tue-Wed, Sun 7:30 pm - 1 am
Thu-Sat 7:30 pm - 2 am

结果数组:

Array
(
[Mon] =>  9 pm - 1 am
[Tue] => 
[Wed] => 
[Thu] =>  7:30 pm - 2 am
[Fri] =>  7:30 pm - 2 am
[Sat] =>  7:30 pm - 2 am
[Sun] => 
)

看来我必须将Tue-WedSun 分开,从

Tue-Wed, Sun 7:30 pm - 1 am

Tue-Wed 7:30 pm - 1 am
Sun 7:30 pm - 1 am

@Khattam:这段时间:

Mon 9 pm - 1 am
Tue-Wed, Sun 7:30 pm - 1 am
Thu-Sat 7:30 pm - 2 am

给予:

Array
(
[Mon] => 9 pm - 1 am
[Tue] => 7:30 pm - 1 am
[Wed] => 7:30 pm - 1 am
[Thu] => 7:30 pm - 2 am
[Fri] => 7:30 pm - 2 am
[Sat] => 7:30 pm - 2 am
[Sun] => 
[
] => 
)

【问题讨论】:

  • 你有一些代码吗?你试过了吗?
  • 我有点卡住了,考虑到案例Mon-Tue, Mon-Wed, Mon-Thu, Mon-Fri, Mon-Sat, Mon-Sun, Tue-Wed, Tue-Thu... 等有大量的 if/else 语句
  • 考虑用- 拆分该字符串,然后解决问题。

标签: php javascript jquery arrays codeigniter


【解决方案1】:

使用RegExp 解析天数,然后使用集合中每一天的相同值遍历天数。

var hrsCondensed = ["Mon-Fri 11 am - 7:30 pm", "Sat 11 am - 6 pm"];
var hrsExpanded = ["","","","","","",""];
var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
$.each(hrsCondensed, function()
{
    if (/([a-z]{3})-([a-z]{3}) (.+)/i.test(this))
    {
        var start = RegExp.$1;
        var end = RegExp.$2;
        var hrs = RegExp.$3;
        var i = $.inArray(start, days);
        hrsExpanded[i] = hrs;
        while(days[i] != end)
        {
            if (++i > 6) i = 0;
            hrsExpanded[i] = hrs;
        }
    }
    else
    {
        var day = this.substr(0, 3);
        var hrs = this.substr(4);
        var i = $.inArray(day, days);
        hrsExpanded[i] = hrs;
    }
});

实时工作示例:http://jsfiddle.net/gilly3/9KztG/

【讨论】:

    【解决方案2】:

    使用正则表达式!

    示例(又快又脏):

    <html>
    <body>
    
    <script type="text/javascript">
    var a = [];
    a.push("Mon-Fri 11 am - 7:30 pm");
    a.push("Sat 11 am - 6 pm");
    
    var seeker = /(\d{1,2}|\d{1,2}:\d{1,2}) (am|pm)/g;
    for (var i = 0; i < a.length; ++i) {
        document.write(a[i] + " ==> ");
        document.write(a[i].match(seeker) + "<br>");
    }
    </script>
    
    </body>
    </html>
    

    将此代码放入a sandbox,您将获得:

    Mon-Fri 11 am - 7:30 pm ==> 11 am,7:30 pm
    Sat 11 am - 6 pm ==> 11 am,6 pm
    

    来源:String.match()JavaScript Regexp

    【讨论】:

      【解决方案3】:

      这应该可以帮助您入门。

      var dates = ['Mon-Fri 11 am - 7:30 pm','Sat 11 am - 6 pm'];//for testing
          var regex = '(\\w{3})-?(\\w{3})?\\s+(.*)';
          var week = {'Mon':0, 'Tue':1, 'Wed':2, 'Thu':3, 'Fri':4, 'Sat':5, 'Sun':6};
          function foo(){
              var datum = [];
              re = new RegExp(regex);
              for(i in dates){
                  match = re.exec(dates[i]);
                  if(match != null){
                      from = week[match[1]];
                      to = match[2]? week[match[2]]: from;
                      tim = match[3];
      
                      for(i=from; i<=to; ++i){
                          datum[i] = tim;
                      }
                  }
              }
      
              alert(datum);
          }
      

      【讨论】:

        【解决方案4】:

        您还可以使用控制器操作,其代码类似于以下:

        <?php
        $days = array(    
            'Mon',
            'Tue',
            'Wed',
            'Thu',
            'Fri',
            'Sat',
            'Sun'
        );
        $combined = "Tue-Wed, Sun 7:30 pm - 1 am";
        $combined = explode("\n",$combined);
        
        foreach($combined as &$c){
            $commaPosition = strpos($c,', ');
            if($commaPosition!==false){
                array_push($combined,substr($c,$commaPosition+2));
                $spacePosition = strpos($c,' ',$commaPosition+2);
                $c = substr($c,0,$commaPosition).substr($c,$spacePosition);
            }
        }
        
        $splitArray = array();
        foreach($days as $d){
            $splitArray[$d]='';
        }
        foreach($combined as $c){
            $daysRange = explode(' ',$c);
            $daysRange = $daysRange[0];
            if(strpos($daysRange,'-')===false){
                $splitArray[$daysRange] = substr($c,strlen($daysRange)+1);
            }
            else{
                $temp = explode('-',$daysRange);
                $dayStart = $temp[0];
                $dayStartIndex = array_search($dayStart,$days);
                $dayEnd = $temp[1];
                $dayEndIndex = array_search($dayEnd,$days);
                for($i=$dayStartIndex;$i<=$dayEndIndex;$i++){
                    $splitArray[$days[$i]] = substr($c,strlen($daysRange)+1);
                }
            }
        }
        
        echo json_encode($splitArray);
        

        然后使用 $.getJSON() 获取数据。

        【讨论】:

        • 太好了!现在我有一个字符串,如上面更新的问题所示,代码现在需要考虑逗号...
        • 我认为调整必须在$daysRange 并且以', ' 作为分隔符,以及额外的elseif 条件elseif(strpos($daysRange,'-') == true &amp;&amp; strpos($daysRange,', ') == true),然后我被卡住了:(
        • @Nyxynyx 刚刚添加了一个循环来将逗号更改为旧格式。这应该有效。
        猜你喜欢
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        相关资源
        最近更新 更多