2013-12-14 71 views
0
<?php 
echo '<pre>'; 
error_reporting(E_ALL); 

$pid = '129'; 

$families = array 
(
     "Griffin"=>array 
         (
         "PTY"=>"Peter", 
         "STY"=>"X", 
         "QTY"=>"A|F" 
        ), 
     "Quagmire"=>array 
         (
         "NTY"=>"Glenn" 
        ), 
     "Brown"=>array 
        (
        "FTY"=>"Cleveland", 
        "OTY"=>"Q|G|T|Y", 
        "PTY"=>"Junior" 
       ) 
); 

global $allid; 

$allid = array(); 
function buildid($pid,$key,$val){ 

    if (preg_match("/\|/",$val)){ 
     $val = explode("|",$val); 
      foreach($val as $val1){ 
       $id = $pid.'-'.$key.'-'.$val1; 
       $allid[] = $id; 

      } 
    } 
} 

print_r($allid); 

foreach($families as $familieskey=>$familiesvalue){ 
    foreach($familiesvalue as $skey=>$sval){ 
     buildid($pid,$skey,$sval); 
    } 
} 
echo '</pre>'; 
?> 

預期輸出爲上述代碼:PHP數組空的功能以外

情況1:

Array 
    (
     [0] => 129-QTY-A 
     [1] => 129-QTY-F 
    ) 
    Array 
    (
     [0] => 129-OTY-Q 
     [1] => 129-OTY-G 
     [2] => 129-OTY-T 
     [3] => 129-OTY-Y 
    ) 

情況2:

Array 
    (
     [0] => 129-QTY-A 
     [1] => 129-QTY-F 
     [2] => 129-OTY-Q 
     [3] => 129-OTY-G 
     [4] => 129-OTY-T 
     [5] => 129-OTY-Y 
    ) 
+0

使用相同的代碼與不同的邏輯也可以重複嗎? – Neocortex

回答

3

global $allid;進入功能本身,而不是外,即使用

function buildid($pid,$key,$val){ 
     global $allid; 
     if (preg_match("/\|/",$val)){ 
    ... 

documentation該指出

global關鍵字之外的功能不是錯誤。如果文件包含在函數中,則可以使用它。

- >除非你從函數中包含它,否則它沒有任何作用。

修改添加:您還需要在運行代碼後(即在echo '</pre>';之前)放置print_r - 當前,您在初始化數組後顯示陣列的內容,然後用數據填充它,然後你的程序結束。

+0

不,它不工作。我得到一個emtpy數組! – Neocortex

+2

只是注意到還有一個額外的問題:您首先執行print_r,然後*實際運行代碼。您需要將print_r放在代碼的* end *處。 –

0

首先。在設置此數組之前,您先製作print_r($allid)。您只在「foreach($families as $familieskey=>$familiesvalue){ ...」中執行了此操作。]

Second.Done。

TRY

error_reporting(E_ALL); 

$pid = '129'; 

$families = array 
(
     "Griffin"=>array 
         (
         "PTY"=>"Peter", 
         "STY"=>"X", 
         "QTY"=>"A|F" 
        ), 
     "Quagmire"=>array 
         (
         "NTY"=>"Glenn" 
        ), 
     "Brown"=>array 
        (
        "FTY"=>"Cleveland", 
        "OTY"=>"Q|G|T|Y", 
        "PTY"=>"Junior" 
       ) 
); 


function buildid($pid,$key,$val){ 
global $allid; 
    if (preg_match("/\|/",$val)){ 
     $val = explode("|",$val); 
      foreach($val as $val1){ 
       $id = $pid.'-'.$key.'-'.$val1; 
       $allid[] = $id; 

      } 
    } 
} 



foreach($families as $familieskey=>$familiesvalue){ 
    foreach($familiesvalue as $skey=>$sval){ 
     buildid($pid,$skey,$sval); 
    } 
} 


print_r($allid); 
+0

你可以重新短語,你的答案不清楚! – Neocortex

0

要設置其值之前輸出陣列。所以代碼應該是這樣的。 您的函數buildid()在輸出數組之前已定義但未調用。 so print_r($ allid);應該在它的值在foreach循環中被填充後調用。

<?php 
echo '<pre>'; 
error_reporting(E_ALL); 

$pid = '129'; 

$families = array 
(
    "Griffin"=>array 
    (
     "PTY"=>"Peter", 
     "STY"=>"X", 
     "QTY"=>"A|F" 
    ), 
    "Quagmire"=>array 
    (
     "NTY"=>"Glenn" 
    ), 
    "Brown"=>array 
    (
     "FTY"=>"Cleveland", 
     "OTY"=>"Q|G|T|Y", 
     "PTY"=>"Junior" 
    ) 
); 

$allid = array(); 

function buildid($pid,$key,$val){ 
    //Global should be inside function like this. 
    global $allid; 
    if (preg_match("/\|/",$val)){ 
     $val = explode("|",$val); 
     foreach($val as $val1){ 
      $id = $pid.'-'.$key.'-'.$val1; 
      $allid[] = $id; 

     } 
    } 
} 

foreach($families as $familieskey=>$familiesvalue){ 
    foreach($familiesvalue as $skey=>$sval){ 
     buildid($pid,$skey,$sval); 
    } 
} 
print_r($allid); 
echo '</pre>'; 
?> 
+0

對不起老兄!已經由Jan Schejbal回覆了 – Neocortex