2013-01-15 4 views
0

에서 다차원 배열을 생성합니다. 이제이 중 다차원 배열을 만들고 싶습니다. 배열은 다음과 같아야합니다내가 플랫 텍스트로 메뉴 탐색을 얻을 텍스트 필드가 일반 텍스트

Array 
(
   [Company] => Array 
       (
           [Apple] => Array 
               (
                   [Inbound] => '', 
                   [Outbound] => Array 
         (
          [Delete] => '' 
         ) 
               ) 

하지만 난 어떻게 그렇게하는 단서가 없다. 아무도 내게 힌트를 줄 수 있습니까?

+2

당신은 아무것도 시도? 당신의 당신은 당신이 시도 몇 가지 코드를 게시 할 경우 도움을받을 훨씬 더 가능성이 높습니다. – Pitchinnate

+0

각 라인을 통해 루프를 시도하고 그 라인이 시작 -' 얼마나 많은'계산합니다. 그게 당신의 항목이 어떻게되는지 깊이 당신을 말할 것이다, 그것은 아이, 부모 또는 형제 자매가 있는지 여부. –

+0

맞습니다 그리고 내가 시도 방법,하지만 내 문제는 배열 키를 만들 ... 내가으로, preg_match_all, strpos, str_repeat으로 시도하는 방법을했다 ...하지만 내가 놀라운 ARMON을의 세 번째 키 ... – codeworxx

답변

0

@Rocket 위험물 올바른 것입니다. 대시는 각 항목의 깊이를 나타냅니다. 이 시도 :

<?php 

function parse_line($line) 
{ 
    $split = explode(" ", $line); 
    $result = count($split) == 1 ? array(0, $split[0]) : array(strlen($split[0]), $split[1]); 
    return $result; 
} 

function find_parent($item, $lines) 
{ 
    $dashes = str_pad("", $item[0], '-'); 
    $orig_line = $item[0] ? $dashes.' '.$item[1] : $item[1]; 
    $key_of_orig_line = array_search($orig_line, $lines); 
    $depth = $item[0]; 
    for($i = $key_of_orig_line-1; $i > -1; $i--) 
    { 
     $current_item = parse_line($lines[$i]); 
     $current_depth = $current_item[0]; 
     if($current_depth < $depth) 
     { 
      return $current_item; 
     } 
    } 
    return array(null, null); 
} 

function get_trail($item, $lines) 
{ 
    $trail = array(); 
    $parent = find_parent($item, $lines); 
    $trail[] = $parent[1]; 
    while($parent[1] != null) 
    { 
     $parent = find_parent($parent, $lines); 
     $trail[] = $parent[1]; 
    } 
    return array_reverse($trail); 
} 

function add_to_menu($item, $trail, $menu) 
{ 
    $cursor = &$menu; 
    for($i = 0; $i < count($trail); $i++) 
    { 
     if($trail[$i] == null) continue; 
     $trail[$i] = substr($trail[$i], 0, -3); 
     if(!array_key_exists($trail[$i], $cursor) || $cursor[$trail[$i]] == '') $cursor[$trail[$i]] = array(); 
     $cursor = &$cursor[$trail[$i]]; 
    } 
    $cursor = array_merge($cursor, array(substr($item[1], 0, -3) => '')); 
    return $menu; 
} 

function assign_ids($lines) 
{ 
    $new = array(); 
    $id_counter = 100; 
    foreach($lines as $line) 
    { 
     $new[] = $line.$id_counter; 
     $id_counter++; 
    } 
    return $new; 
} 

function p($s) { echo '<pre>'; print_r($s); echo '</pre>'; } 

$input = "Company 
- Apple 
-- Inbound 
-- Outbound 
--- Delete 
- Microsoft 
-- Inbound 
Invoices 
- Customers 
-- Apple 
--- January"; 

$menu = array(); 

$lines = explode("\n", $input); 
$lines = array_map("trim", $lines); 
$lines = assign_ids($lines); 

foreach($lines as $line) 
{ 
    $item = parse_line($line); 
    $trail = get_trail($item, $lines); 
    $menu = add_to_menu($item, $trail, $menu); 
} 

p($menu); 

?> 
+0

에 온 적이 그! 정말 고맙습니다! 그것은 완벽하게 작동합니다! – codeworxx

관련 문제