2012-10-24 152 views
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中做到這一點?

+5

循環訪問數組並建立字符串。 – Jrod

回答

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; 
} 
+0

非常感謝。這正是我所需要的。實際上更多。再次感謝 – giuliot

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