0

这是一个非常奇怪的问题,对于问题的标题,我很抱歉,但我想不出一个好的问题。

无论如何,我有一系列价格,一周中的每一天都有一个。

 array = (
   [Mon] => 0.40,
   [Tue] => 0.40,
   [Wed] => 0.40,
   [Thu] => 0.40,
   [Fri] => 0.40,
   [Sat] => 0.50,
   [Sun] => 
 )

如您所见,一天或多天可能是空的,价格可能每天都不同。

我需要得到一个字符串

 Mon - Fri 0.40, Sat 0.50

我有点需要平板阵列,只要价格一样。

上面的只是一个例子,我可能在数组中有“洞”,例如,如果我没有周三的价格,那么结果字符串应该是

 Mon - Tue 0.40, Thu - Fri 0.40, Sat 0.50

有什么建议我可以在 PHP 中做到这一点吗?

4

3 回答 3

1

你可以试试这个...

你的阵列

$array = array(
        "Mon" => 0.40,
        "Tue" => 0.40,
        "Wed" => 0.40,
        "Thu" => 0.40,
        "Fri" => 0.40,
        "Sat" => 0.50,
        "Sun" => null);

示例 1

var_dump(groupDateTime($array));

输出

array
  0 => 
    array
      's' => string 'Mon' (length=3)
      'e' => string 'Fri' (length=3)
      't' => float 0.4
  1 => 
    array
      's' => string 'Sat' (length=3)
      'e' => string 'Sat' (length=3)
      't' => float 0.5

示例 2

 var_dump(groupDateTime($array,true));
                                ^---------- Optional Formatting 

输出

array
  0 => string 'Mon - Fri 0.4' (length=13)
  1 => string 'Sat 0.5' (length=7)

使用的功能

function groupDateTime($array, $format = false) {
    $group = array();
    $x = 0;
    foreach ( $array as $day => $time ) {
        if (empty($group[$x]) === true) {
            $group[$x]['s'] = $day;
            $group[$x]['e'] = $day;
            $group[$x]['t'] = $time;
        }
        if ($group[$x]['t'] === $time) {
            $group[$x]['e'] = $day;
            continue;
        }
        $x ++;
        $group[$x]['s'] = $day;
        $group[$x]['e'] = $day;
        $group[$x]['t'] = $time;
    }

    $group = array_filter($group, function ($v) {
        return ! empty($v['t']);
    });
    if ($format === true)
        $group = array_map(function ($v) {
            if ($v['s'] == $v['e'])
                return "{$v['s']} {$v['t']}";
            return "{$v['s']} - {$v['e']} {$v['t']}";
        }, $group);
    return $group;
}
于 2012-10-24T16:26:53.717 回答
0

这是一种方法。

$weekArr = array(
    'Mon' => 0.40,
    'Tue' => 0.40,
    'Wed' => 0.40,
    'Thu' => 0.30,
    'Fri' => 0.40,
    'Sat' => 0.50,
    'Sun' => NULL
);

$res = array();

foreach ($weekArr as $key => $value) {
    if (is_null($value)) continue;
    if (empty($res)) $res[] = array('begin'=>$key,'value'=>$value);
    else {
        $lastItem =& $res[count($res)-1];
        if ($lastItem['value'] == $value) $lastItem['end'] = $key;
        else $res[] = array('begin'=>$key,'value'=>$value);
        unset($lastItem);
    }
}
foreach ($res as &$arr) {
    $newVal = $arr['begin'];
    if (isset($arr['end'])) $newVal .= ' - ' . $arr['end'];
    $arr = $newVal . ' ' . $arr['value'];
}
unset($arr);

// and the output:  
print_r($weekArr);
print_r($res);
echo implode(', ',$res);
于 2012-10-24T17:54:15.653 回答
0

作为您的问题的解决方案,请参考下面的代码片段,它在遍历数组时生成一个字符串。

$a=array('Mon'=>0.40,'Tue'=>0.40,'Wed'=>'','Thu'=>0.5,'Fri'=>0.4,'Sat'=>0.4,'Sun'=>0.4);
$t=array();
$x=array();
$keys=array_keys($a);
$current_element=current($a);
$x[$keys[0]]=$current_element;
foreach($a as $key=>$value)
{
if(!in_array($value,$t)& !in_array($value,$x) && !empty($value))
{
   $t[$key]=$value;

}
else if( !empty($value))
{
    $x[$key]=$value;
     }
 }
$m=array_keys($t);
$n=array_keys($x);
$s=current($n);
$s.='- '.end($n);
$s.=' '.current(array_values($x));
$s.= ' '.current($m);
$s.=' '.current(array_values($t));
echo $s;
于 2012-10-24T18:50:58.013 回答