2012-10-24 7 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; 
관련 문제