2014-04-28 37 views
1

我是新來的PHP,我試圖做一個簡單的程序。如果數組只包含一個$result將是「a」,如果b $result將是「b」,如果一個& b然後「ab」等在這種情況下數組包含a,b ,和c和由於某種原因,當我運行它只顯示「c」。 這裏是我的代碼:php的嵌套循環,如果不工作

$a[0] = "b"; 
$a[1] = "a"; 
$a[2] = "c"; 
for ($j=0; $j<sizeof($a); $j++) { 
    for ($k=0; $k<sizeof($a); $k++) { 
     for ($l=0; $l<sizeof($a); $l++) { 
      if ($a[$j] == "a"){ 
       $result="a"; 
      } 
      elseif ($a[$j] == "b") { 
       $result="b"; 
      } 
      elseif ($a[$j] == "c") { 
       $result="c"; 
      } 
      elseif ($a[$j] == "a" and $a[$k] == "b") { 
       $result="ab"; 
      } 
      elseif ($a[$j] == "c" and $a[$k] == "b" and $a[$l] == "a") { 
       $result="abc"; 
      } 
      elseif ($a[$j] == "b" and $a[$k] == "c") { 
       $result="bc"; 
      } 
     } 
    } 
} 
echo ($result); 

在此先感謝

+0

? – HeroFTime

+0

如果你有3個嵌套循環,這意味着你做錯了什麼 – meda

+0

它只是回聲'c',因爲你在每次循環迭代中覆蓋'$ result',所以它只會迴應'$ result'的最後一個設置。 。您可以通過將所有'$ result ='更改爲'$ result。='來查看您的行爲,並且您將看到您當前的代碼產生 - 'bbbbbbbbbaaaaaaaaaccccccccc' – Sean

回答

0

僅使用一個環和三個標誌。嘗試這樣的事情

$a[0] = "b"; 
$a[1] = "a"; 
$a[2] = "c"; 
$hasA = false; 
$hasB = false; 
$hasC = false; 
for ($j=0; $j<sizeof($a); $j++) { 
    if ($a[$j] == "a"){ 
     $hasA = true; 
    } 
    elseif ($a[$j] == "b"){ 
     $hasB = true; 
    } 
    elseif ($a[$j] == "c"){ 
     $hasC = true; 
    } 
} 
if ($hasA) echo 'a'; 
if ($hasB) echo 'b'; 
if ($hasC) echo 'c'; 
0

所有這些循環的第一次是不是真的有必要。

使用php開關。

switch($value){ 
    case "a": 
    // Actions here 
    case "b": 
    // Actions here 
} 

你在這些for循環中所做的是繼續用新值覆蓋$ result。 最後顯示它找到的最後一個字母。

除了這個事實,這個代碼有什麼用途。嘗試尋找一個PHP調試器,我會推薦使用Xdebug。

調試器通過逐行進入代碼並顯示每個變量的狀態來幫助程序員檢測問題。

一個很好的教程和發展環境在教程中找到here

0

這裏有一個簡單的方法來實現這一目標:

$a = array('a', 'b', 'c'); 

$result = ''; 
if(in_array('a', $a)){ 
$result .= 'a'; 
} 
if(in_array('b', $a)){ 
$result .= 'b'; 
} 
if(in_array('c', $a)){ 
$result .= 'c'; 
} 
echo $result; 
+0

它只顯示「a」。我的意思是如果我的數組包含「a,b和c」,那麼結果將是「abc」,就像我的代碼中的那些一樣。如果在我的陣列中只有「a,b」,它只會顯示「ab」 – wiko

+0

刪除其他語句 – miltos

+0

@botanbutton對不起,我修好了,這將避免循環 – meda

0

讓我們採取不同的方法:

$array="asdasd"; 
$check=$arry[0]; 

$all_the_same=true; 

for($i=1; $i<count($array); $i++){ 
    if(array[$i] !== $check){ 
     $all_the_same=false; 
     break; 
    } 
} 

我所做的一切是檢查所有的字母在數組中查看它們是否完全相同,如果它們不是,則將$all_the_same設置爲false。要找出陣列是否有你想要的字母:

if($check==="a") 
    echo "has 'a'"; 

或許更文明的switch/case聲明。

與您的代碼的問題是,你運行三個循環相同的數據$j變化非常緩慢(每sizeof($a)平方精確),這是你檢查的第一件事,所以毫不奇怪它總是顯示「c」。

0
$a[0] = "b"; 
$a[1] = "a"; 
$a[2] = "c"; 
$result = ''; 
foreach($a as $value) { 
    if($value == 'a') 
     $result .= 'a'; 
    if($value == 'b') 
     $result .= 'b'; 
    if($value == 'c') 
     $result .= 'c'; 
} 

echo $result; 

下面是你試圖做的更流暢的版本!

0
sort($array); 
implode(array_unique( $array)); 

由於@GarethL曾提到

+0

@GarethL謝謝先生..更新 – lagbox

0

對於這個問題的用意,你爲什麼循環三次,可以達到這個簡單的代碼

<?php 
$a[0] = "b"; 
$a[1] = "a"; 
$a[2] = "c"; 
$result = implode($a); 
echo $result;