将组合字符串拆分为数组

3

我在这里提出了一个问题,关于如何合并开店时间相似的日子。

合并开店时间相似的日子

现在我需要帮助做相反的事情:将包含合并日期的字符串拆分为单独的日期,并按照日期顺序存储在数组中(星期一第一天,星期日最后一天)。

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

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] => 
)

看起来我必须从 Sun 中分离出 Tue-Wed,来自

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] => 
[
] => 
)

1
你已经有一些代码了吗?你尝试过对它进行一些操作吗? - Null Head
我有些卡住了,因为有大量的if/else语句需要考虑“星期一至星期二、星期一至星期三、星期一至星期四、星期一至星期五、星期一至星期六、星期一至星期日、星期二至星期三”等情况。 - Nyxynyx
1
考虑使用“-”分割该字符串,然后解决问题。 - Dogbert
4个回答

1
使用正则表达式来解析日期,然后通过相同的值迭代日期集合中的每一天。
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/


1
你也可以使用一个控制器动作,其代码类似于以下内容:
<?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()获取数据。

太好了!现在我有一个字符串,就像上面更新的问题中所示,代码现在需要考虑逗号... - Nyxynyx
我认为必须在 $daysRange 上进行微调,使用 ', ' 作为分隔符进行分割,并添加一个额外的 elseif 条件 elseif(strpos($daysRange,'-') == true && strpos($daysRange,', ') == true),然后我卡住了 :( - Nyxynyx
@Nyxynyx 刚刚添加了一个循环来将逗号分隔的数字更改为旧格式。这应该可以运行。 - khattam

0

使用正则表达式!

示例(快速且简单):

<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>

将此代码放入沙盒中,您将获得:
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


0

这应该可以帮助你入门。

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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接