2011-02-09 10 views
0

문자열에서 분해 한 2D 배열이 있습니다. 즉, 배열의 각 위치에 대해 그것은 단지 이전에 첫 번째 값 ~ 소요 있도록PHP : 배열 요소 폭발

---> 0 - 16~4~0.0~~~~false~~~~ 
---> 1 - 1000.0~21.75~L~1~2.0~2.0~L~2~ 
---> 2 - 
---> 0 - 2~5~951.3~6.4~~~false~~~~ 
---> 1 - 1000.0~11.77~L~1~ 
---> 2 - 
---> 0 - 3~6~1269.02~5.1~~~false~~~~ 
---> 1 - 5.0~213.66~L~1~4.9~2.56~L~2~4.6~19.5~L~3~ 
---> 2 - 5.1~53.44~B~1~5.4~8.48~B~2~5.5~15.53~B~3~ 

내가 그것을 만들고 싶어 :이 폭발하면이 출력되는 것입니다. 어떻게해야할지 모르겠습니다. 이것은 내가 지금까지 가지고있는 코드 :

$test = explode(":", $string); 
foreach($test as &$value) $value = explode('|', $value); 

이 원래 문자열 입력을 필요로 그냥 경우 :

1 ~ 1 ~ 828.32 ~ 12.5 ~~~ 거짓 ~~~~ | 1000.0 ~ 41.73 ~ L ~ 1 ~ 2.0 ~ 2.0 ~ L ~ 2 ~ | : 4 ~ 2 ~ 4.16 ~ 12.5 ~ ~ ~ 거짓 ~~~~ | 1000.0 ~ 21.75 ~ L ~ 1 ~ 2.0 ~ 2.0 ~ L ~ 2 ~ ~ : ~ 9 ~ 3 ~ 0.16 ~ 24.0 ~ ~ ~ 거짓 ~~~~ | ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 거짓 ~ ~ ~ ~ : ~ ~ ~ ~ : 16 ~ 4 ~ 0.0 ~~~~ 거짓 ~~~ ~ 1000.0 ~ 21.75 ~ L ~ 1 ~ 2.0 ~ 2.0 ~ L ~ 2 ~ | : 2 ~ 5 ~ 951.3 ~ 6.4 ~~~ 거짓 ~~~~ | 1000.0 ~ 11.77 L ~ 1 ~ | : 3 ~ 6 ~ 1269.02 ~ 5.1 ~ ~ ~ 거짓 ~~~~ | 5.0 ~ 213.66 ~ L ~ 1 ~ 4.9 ~ 2.56 ~ L ~ 2 ~ 4.6 ~ 19.5 ~ L ~ 3 ~ | 5.1 ~ 53.44 ~ B ~ 1 ~ 5.4 ~ 8.48 ~ B ~ 2 ~ 5.5 ~ 15.53 ~ B ~ 3 ~ : 8 ~ 7 ~ 111.92 ~ 7.0 ~ ~ ~ false ~~~~ | 6.8 ~ 6.78 ~ L ~ 1 ~ 6.6 ~ 148.39 ~ L ~ 2 ~ 6.4 ~ 3.7 ~ 3 ~ | 7.6 ~ 128.0 '...

I 출력을 원하는

가되게합니다 : 나는 당신의 질문을 이해한다면

---> 0 - 16 
---> 1 - 1000.0 
---> 2 - 
---> 0 - 2 
---> 1 - 1000.0 
---> 2 - 
---> 0 - 3 
---> 1 - 5.0 
---> 2 - 5.1 
+0

제가 이해할 수 있다고 생각 합니다만, 분명히 원하는 출력이 어떻게 생겼는지 정확하게 추가 할 수 있습니까? – thirtydot

+0

[strtok - 토큰 문자열] (http://us2.php.net/manual/en/function.strtok.php) – drudge

답변

2

제대로 이해하면이 배열의 각 요소를 가져 와서 첫 번째 문자 다음에 나오는 모든 것을 잘라내고 싶습니다. 코드에 건물 :

$test = explode(":", $string); 
foreach($test as &$value) 
{ 
    $value = explode('|', $value); 
    foreach($value as &$inner_value) 
    { 
     $inner_value = substr($inner_value, 0, strpos($inner_value, '~')); 
    } 
} 

나는 각각의 값을 검사하고 ~ 문자 다음에 문자열의 나머지 부분을 제거하는 내부 foreach 루프 첨가 하였다 모든.

코딩 최고!

0

이 작동합니다 :

$output = array(); 
$test = explode(":", $string); 
foreach($test as $value) { 
    $pipes = explode('|',$value); 
    foreach($pipes as $cur) { 
     $idx = strpos($cur,'~'); 
     if($idx > -1) { 
      $output[] = substr($cur,0,$idx); 
     } else $output[] = ''; 
    } 
} 

을이 실행이 완료되면, $ 출력이 원하는 정보를 포함합니다 . 또한 재귀 함수를 작성하거나 정규식을 사용할 수도 있지만 두 솔루션 모두 조금 더 복잡합니다.

당신은 ~으로 각 라인을 폭발하고 첫 번째 요소를 취할 수

0

HTH.

$test = explode(":", $string); 
foreach($test as &$value) { 
    $value = explode('|', $value); 
    $result = explode('~', $value); 
    $first = $result[0]; 
} 

하지만 첫 번째 요소 만 필요하면 매우 비효율적이 될 수 있습니다. 정규 표현식이 다른 해결책이 될 수 있습니다. 이처럼 :

\|(.+?)~ 

~까지의 | 후 모든 문자열을 일치. 이것은 문자열의 시작 부분에서 중단되지만 정규식 일치를 위해 |을 앞에 추가 할 수 있습니다.

+0

구문 오류가 발생할 수 있습니다. PHP는 변수가 아닌 다른 변수의 오프셋을 가져 오지 못하게합니다. – superultranova

+0

@Casey 고맙습니다. 수년에 걸쳐 나는 PHP가 실제로 어떻게 작동했는지 용서하지 못했습니다. :) –

+0

np, 나는 PHP가 그렇게 할 수 있었으면 좋았을 것이다. – superultranova

0

구분 기호까지 문자열 부분 만 자르려면 explode() 대신 strtok()을 사용하십시오.

나는 현재 예제를 얻지 못했습니다.그러나 그것은 다음과 같을 수 있습니다 :

foreach ($test as $i=>$value) { 
    $test[$i] = strtok($value, '|'); 
}