将数组转换为字符串

时间:2012-10-24 15:54:12

标签: php

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

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

 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中执行此操作?

3 个答案:

答案 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;