2014-05-24 1 views
-2

PHP로 C# 코드를 이식하고 있습니다.PHP 배열이 인덱스 가능하지 않습니다.

그러나 PHP에서는 배열 참조를 무시합니다. 아래 코드는 마지막 요소를 세 번 나타냅니다. 이 문제를 어떻게 해결할 수 있습니까? PHP에서

class Participants 
{ 
    public $name; 
    public $country; 
    public $town; 

} 

class Test 
{ 
    public function __construct() 
    { 
     $this->List = array(new Participants()); 
    } 

    public function test() 
    {   
     $p = new Participants(); 

     $p->name = "Harry"; 
     $p->town = "Washington"; 
     $p->country = "USA"; 

     $List[0] = $p; 

     $p->name = "Janette"; 
     $p->town = "Amsterdam"; 
     $p->country = "Netherlands"; 

     $List[1] = $p; 

     $p->name = "Piotr"; 
     $p->town = "Moscow"; 
     $p->country = "Russia"; 

     $List[2] = $p; 

    echo $List[0]->name; 
    echo $List[1]->name; 
    echo $List[2]->name; 
     // this unfortunately ignores the index and echoes 3 times the last element. 

    } 
}//end Test Class 
+1

_Or _... 3 개가 아닌 하나의 객체를 만들고 동일한 배열에 배열의 각 항목을 할당했습니다. 그냥'new '을 사용하고있는 횟수를 세고 C# 배경에서 오는 경우 문제가 명확해야합니다. – Clive

+1

@ user3416660 시프트 레지스터 등에 대한 단락을 삭제했습니다. 부적절하거나 잘못되었습니다. 귀하의 질문을 짧고 정확하게 지키십시오. 또한 생성자'$ this-> List = array (new Participants());'는 당신이 생각하는 것을하지 않습니다. PHP에서는 배열의 값 유형을 선언 할 필요가 없습니다. '$ this-> List = array();'로 충분합니다. 또는 클래스 변수를 더 좋게 만들 수도 있습니다. – dtech

+0

이 문제가 해결되었지만 문제가 해결되지는 않습니다. 이전 생성자를 사용하면 count() 함수가 최소한 올바른 배열 요소 수를 반환했습니다. 단축 생성자를 사용하면 count 함수가 0을 반환합니다. – user3416660

답변

2

배열은 실제로 HashMaps을을 정렬하고 색인입니다. 귀하의 문제는 "색인 무시됨"과 관련이 없습니다. 문제는 $List[0], $List[1]$List[2]은 모두 동일한 개체에 대한 참조입니다.

+0

감사 파일. 그러나이 구성은 이미 C#에서 작동했습니다. 함수 test()가 한 번만 호출되면 인스턴스 $ p도 한 번만 생성되며이 호출 내에서 다양한 배열 요소가 인덱스에 의해 액세스됩니다. 그러나 PHP 배열이 결국 인덱스 가능하다고 가정하면, $ List [0] -> name에 대한 올바른 구문은 무엇입니까? – user3416660

+0

어레이의 첫 번째 객체의 이름 속성을 원한다면 _is_ 올바른 구문입니다. – Clive

2

개체가 변경 가능하면 고유 개체 1 개만 만들고 이름/마을/국가를 3 번만 변경하십시오.

당신이 객체의 사본을 만들 수는 없지만, 대신 $List[0] 당신이 다음 변경을 진행 $p와 같은 객체에 대한 참조를 제공 $p$List[0]에 할당

.

$p = new Participants(); 
    $p->name = "Harry"; 
    $p->town = "Washington"; 
    $p->country = "USA"; 
    $List[0] = $p; 

    $p = new Participants(); 
    $p->name = "Janette"; 
    $p->town = "Amsterdam"; 
    $p->country = "Netherlands"; 
    $List[1] = $p; 

    $p = new Participants(); 
    $p->name = "Piotr"; 
    $p->town = "Moscow"; 
    $p->country = "Russia"; 
    $List[2] = $p; 

이 C#을 포함 BTW 거의 모든 OOP 언어에서 동일하게 작동합니다 : 당신이 3 개체를 원하는 경우

당신은 3 개체를 확인해야합니다. 차이점은 C#에서 할당 할 때 전체 복사본을 만드는 값 형식 (구조체 또는 열거 형)을 정의 할 수 있다는 것입니다. 내 생각 엔 C# Participants은 구조체입니다.

+0

생명의 은인입니다. dtech! 나는 이것을 간과했다. 고마워. 그리고 네, 당신은 절대적으로 옳습니다. 저는 C# 구조체에서 왔습니다. 따라서 이것은 문제가 아닙니다. – user3416660

관련 문제