这是一个非常奇怪的问题,我很抱歉问题的标题,但我想不出一个好的。
无论如何,我有一系列的价格,一周中的每一天。
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中执行此操作?
答案 0 :(得分: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;
}
答案 1 :(得分: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);
答案 2 :(得分: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;