2016-12-02 27 views
0

私はPHP5クラスについてインスタンスに傾いています。しかし、foreachループをClass Methodsの人の性格を得るために使用しようとしていますが、それは最初の人には右にしか表示されませんが、2番目の人には3番目のように正しく表示されません。ここで Foreachが内部で動作していませんクラスメソッド

が私のコードです:

class Person{ 
    // atteributes or property of class 
    var $first_name; 
    var $last_name; 
    var $legs = 2; 
    var $hand = 2; 
    var $gender; 
    function say_hello(){ 
     echo "Hello inside the class from " . get_class($this) . "<br />"; 
    } 
    // full name function 
    function full_name(){ 
     echo $this->first_name ." ". $this->last_name; 
    } 
    // Gender 
    function gender(){ 
     $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer"); 
     foreach($names as $name){ 
      if($this->first_name == $name){ 
       echo $this->gender = "Male"; 
       break; 
      }else{ 
       echo $this->gender = "Female"; 
       break; 
      } 
     } 
    } 
} 

$person = new Person(); 
$person->first_name = "Hamza"; 
$person->last_name = "Nisar"; 
$person->full_name(); 
echo "<br />"; 
$person->gender(); 
echo "<br />"; 
/*---------------------*/ 
$person2 = new Person(); 
$person2->first_name = "Ibrar"; 
$person2->last_name = "Ahmed"; 
$person2->full_name(); 
echo "<br />"; 
$person2->gender(); 
echo "<br />"; 

そして、これが結果です:

Hamza Nisar 
Male 
Ibrar Ahmed 
Female 

それは、foreachループを使用して二人目

答えて

1

あなたのコードが動作しなかった理由これらの答えのどれもあなたにを教えてくれません。のは、foreachののロジックに従ってみましょうするときFIRST_NAME = "Ibrar":

$names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer"); 
foreach($names as $name){ 
    if($this->first_name == $name){ 
     echo $this->gender = "Male"; 
     break; 
    }else{ 
     echo $this->gender = "Female"; 
     break; 
    } 
} 

ループ1:!IF文は "Ibrar" == "ハムザ" として、偽です。したがってELSEが使用され、女性と休憩を印刷します。

他の回答は良い修正です。しかし、まだforeachループを使用したいとします。あなたはこのような何か行うことができます:

$this->gender = 'Female'; 
$names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer"); 
foreach($names as $name){ 
    if ($this->first_name === $name) { 
     $this-gender = 'Male'; 
     break; 
    } 
} 

echo $this->gender; 
1
<?php 

class Person{ 
    // atteributes or property of class 
    var $first_name; 
    var $last_name; 
    var $legs = 2; 
    var $hand = 2; 
    var $gender; 
    function say_hello(){ 
     echo "Hello inside the class from " . get_class($this) . "<br />"; 
    } 
    // full name function 
    function full_name(){ 
     echo $this->first_name ." ". $this->last_name; 
    } 
    // Gender 
    function gender($newname){ 
     $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer"); 
     if(in_array($this->first_name, $names)){ 
      echo $this->gender = "Male";    
     }else{ 
      echo $this->gender = "Female";   
     } 
    } 
} 

$person = new Person(); 
$person->first_name = "Hamza"; 
$person->last_name = "Nisar"; 
$person->full_name(); 
echo "<br />"; 
$person->gender($person->first_name); 
echo "<br />"; 
/*---------------------*/ 
$person2 = new Person(); 
$person2->first_name = "Ibrar"; 
$person2->last_name = "Ahmed"; 
$person2->full_name(); 
echo "<br />"; 
$person2->gender($person2->first_name); 
echo "<br />"; 
?> 
+0

このアップデートを試してください –

+0

ループが必要ないので、この種の作業にはもう適切です。 –

+0

大丈夫私は機能の待機を更新しています –

2

にも男性を表示しており、それぞれの可能性をチェックすることは、これを達成するための奇妙な方法のようです。 foreach関数をin_array関数で置き換えることをお勧めします。これは、if文で使用すると、少ないコードで同じことを行うことができます。

例:以下のように変更ヨール性別機能requredと、関数呼び出しの前にエコー書く一切のforeachはありません

<?php 

class Person{ 
    // atteributes or property of class 
    var $first_name; 
    var $last_name; 
    var $legs = 2; 
    var $hand = 2; 
    var $gender; 
    function say_hello(){ 
     echo "Hello inside the class from " . get_class($this) . "<br />"; 
    } 
    // full name function 
    function full_name(){ 
     echo $this->first_name ." ". $this->last_name; 
    } 
    // Gender 
    function gender(){ 
     $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer"); 
     if(in_array($this->first_name, $names)){ 
      echo $this->gender = "Male"; 
     } 
     else { 
      echo $this->gender = "Female"; 
     } 
    } 
} 

$person = new Person(); 
$person->first_name = "Hamza"; 
$person->last_name = "Nisar"; 
$person->full_name(); 
echo "<br />"; 
$person->gender(); 
echo "<br />"; 
/*---------------------*/ 
$person2 = new Person(); 
$person2->first_name = "Ibrar"; 
$person2->last_name = "Ahmed"; 
$person2->full_name(); 
echo "<br />"; 
$person2->gender(); 
echo "<br />"; 

?> 
+0

違いはありません、私は私がそれを見ていないので、私が掲載したあなたの投稿。 – Hunter

+1

仲間!お互いの戦いを止めて、私はあなたに投票しますheheちょうどループはこれらの仕事の種類ではないことを教えてください。もし私がループでやりたいのであれば、別の解決策がありますか? –

0

function gender(){ 
    $names = array("Hamza","Ali","Ibrar","Muqeet","Hassan","Umer","Shaveer"); 
    if(in_array($this->first_name,$names)){ 
     return $this->gender = "Male"; 
    }else{ 
     return $this->gender = "Female"; 
    } 
} 
1

をあなたはここに気にする必要があります事はブレークキーワードです。期待される結果を得るためには、コードの流れをトレースする必要があります。ここでは、それはあなたにつきコードとしてあるものだと言う:

私はあなたが間違っているコードのセクションから開始します:$personオブジェクト、 $person->gender()については

は次のように実行されます。

イテレーション1:

foreach($names as $name)結果$name = "Hamza"

$this->first_name== $name

ここで真の場合、「男性」が印刷されます。

break; foreachループから壊れます。

他の繰り返しはありません。

出力である:

$person2オブジェクトについて
Male 

$person2->gender()は次のように実行される。

反復1:

foreach($names as $name)結果$name = "Hamza"

$this->first_nameはであり、条件が真でない場合、すなわち「女性」が印刷されている場合、!= $name

です。

break; foreachループから壊れます。

他の繰り返しはありません。

出力は次のようになります。

Female 

あなたのコードは、あなたが欲しいものを言っていません。

それは言う:

配列の最初の項目は、印刷「男性」我々は名前を持っている場合はそうでない場合は、「女性」を印刷します。配列内の最初の項目を確認した後でのみ、foreachループが終了します。同じ配列内の他の項目を確認する必要はありません。

だから、これは結果になります:あなたはそれが"Hamza"として$first_name属性値を持っていません作成Personクラスのオブジェクトごとに

"Female"は、メンバ関数gender()への呼び出しから印刷されます。条件は$this->first_name$names配列の各項目をチェックしなければならないとして、あなたがループから抜け出すべきではありませんfalseある場合

ソリューションは言ってコードを書くことです。 $names配列内のすべての項目がfalseを返した場合は、$gender属性値も "Female"であり、これも出力されます。

ソリューションコード: すでに他の回答に記載されています。

関連する問題