访问关联数组:为什么这个(可能不正确的)代码有效?

Accessing Associative Array: Why does this (probably incorrect) code work?

问题:

在第二个(以下)代码片段中,在 inner foreach 循环中(即 foreach 循环嵌套在另一个 foreach 循环),$value 对应于 $studentCoursesStudied 的一个元素,而不是 $studentCoursesStudied 数组本身,对吧?

访问 $studentCoursesStudied 数组元素值的 correct way 为:

$studentCoursesStudied[$key]

但他们正在访问 $studentCoursesStudied 数组的每个元素的值,如

$value['an-element-name/key']

其中 $value 对应数组的一个元素,而不是数组本身!为什么?

背景: 我正在阅读别人为学习而编写的 PHP 脚本,但我不明白他们如何访问关联数组中的值。所以我写了这个示例代码来问这个问题。

这是一个 Student class,一个学生有一个 属性,其中包含一个名为 recordCoursesStudied.

的关联数组
class Student {
    public $studentName;
    public $studentAge;
    public $studentCoursesStudied = null;

    function __construct($studentName, $studentGpa) {
        $this->studentName = $studentName;
        $this->studentGpa = $studentGpa;
    }

    function recordCoursesStudied ($courseName, $courseNumber, $creditHours, $maxMarks, $courseType) {
        $this->studentCoursesStudied[] = array(
            'courseName' => $courseName;
            'courseNumber' => $courseNumber;
            'creditHours' => $creditHours;
            'maxMarks' => $maxMarks;
            'courseType' => $courseType;
        );  
    }
} 

然后我们想从另一个 class Whatever 的方法 newCourseRecord.

访问 recordCoursesStudied 的元素

注意: 在内部 foreach 循环之后的块注释中,我用更好的名称编写了相同的代码段以使事情更清楚。

class Whatever {
    private $students;
    private $currentStudent;

    function __construct () {
        $this->newStudent('Zarah', 3.4);
        $this->newCourseRecord('DBMS', 'BR223', 3, 100, 'Core');
        $this->doTheWork();
    }

    function newStudent($studentName, $studentGpa) {
        $this->students[$studentName] = new Student($studentName, $studentGpa);
        $this->currentStudent = $studentName;
    }

    function newCourseRecord($courseName, $courseNumber, $creditHours, $maxMarks, $courseType) {
        $this->students[$this->studentName]->recordCoursesStudied($courseName, $courseNumber, $creditHours, $maxMarks, $courseType);
    }

    function doTheWork() {
        ...
        foreach ($this->students as $key=>$value) {
            ...
            foreach($value->studentCoursesStudied as $key=>$value) { /****************************/
                ...
                //Echo each property of $studentCoursesStudied.
                someOtherFunction($value['courseName'], $value['courseNumber'], $value['creditHours'], $value['maxMarks'], $value['courseType']);
                ...
            }
            ...
        }
        /*foreach ($this->students as $studentKey=>$studentValue) {
            ...
            foreach($studentValue->studentCoursesStudied as $courseKey=>$courseValue) { /****************************/
                ...
                //Echo each property of $studentCoursesStudied.
                /*someOtherFunction($courseValue['courseName'], $courseValue['courseNumber'], $courseValue['creditHours'], $courseValue['maxMarks'], $courseValue['courseType']);
                ...
            }
            ...
        }*/
        ...
    }

}

在给定的代码中,在 * 突出显示的 foreach 循环中,他们通过执行以下操作访问了 Student::studentCoursesStudied 数组中的值:

$value-of-an-element-in-array['key-of-an-element-in-array']

但是关联数组的元素不应该像 name-of-array['key-of-an-element-in-array'] 那样访问吗?

您构建了第一个 class 并在

中设置了值
$this->students[$studentName] = new Student($studentName, $studentGpa);

 function newCourseRecord(
                 $courseName, 
                 $courseNumber, 
                 $creditHours, 
                 $maxMarks, 
                 $courseType) {
                    $this->students[$this->studentName]->recordCoursesStudied(
                           $courseName, 
                           $courseNumber, 
                           $creditHours, 
                           $maxMarks, 
                           $courseType);
 }

比你访问循环中的值

    foreach ($this->students as $key=>$value) {
        ...
        foreach($value->studentCoursesStudied as $key=>$value) { /****************************/
            ...
            //Echo each property of $studentCoursesStudied.
            someOtherFunction($value['courseName'], $value['courseNumber'], $value['creditHours'], $value['maxMarks'], $value['courseType']);
            ...
        }
        ...
    }

没错。

尝试以下:

class Student {
private $studentName;
private $studentAge;
private $studentCoursesStudied = null; //private  not run out this class so you can define a public function to get it

public function getStudentCoursesStudied() {
  return $this -> $studentCoursesStudied;
}

function __construct($studentName, $studentGpa) {
    $this->studentName = $studentName;
    $this->studentGpa = $studentGpa;
}

function recordCoursesStudied ($courseName, $courseNumber, $creditHours, $maxMarks, $courseType) {
    $this->studentCoursesStudied = array(
        'courseName' => $courseName;
        'courseNumber' => $courseNumber;
        'creditHours' => $creditHours;
        'maxMarks' => $maxMarks;
        'courseType' => $courseType;
    );  
}
} 


class Whatever {
private $students = array(); // define is a empty array();
private $currentStudent;

function __construct () {
    $this->newStudent('Zarah', 3.4);
    $this->newCourseRecord('DBMS', 'BR223', 3, 100, 'Core');
    $this->doTheWork();
}

function newStudent($studentName, $studentGpa) {
    $this->students[$studentName] = new Student($studentName, $studentGpa);
    $this->currentStudent = $studentName;
}

function newCourseRecord($courseName, $courseNumber, $creditHours, $maxMarks, $courseType) {
//you use $this -> studentName but i n't find where's defined i think you want to use $this -> currentStudent
    $this->students[$this-> currentStudent]->recordCoursesStudied($courseName, $courseNumber, $creditHours, $maxMarks, $courseType); 
}

function doTheWork() {
    ...
    foreach ($this->students as $key=>$value) {
        ...
        foreach($value-> getStudentCoursesStudied() as $key=>$value) { /****************************/
            ...
            //Echo each property of $studentCoursesStudied.
            someOtherFunction($value['courseName'], $value['courseNumber'], $value['creditHours'], $value['maxMarks'], $value['courseType']);
            ...
        }
        ...
    }
    /*foreach ($this->students as $studentKey=>$studentValue) {
        ...
        foreach($studentValue->studentCoursesStudied as $courseKey=>$courseValue) { /****************************/
            ...
            //Echo each property of $studentCoursesStudied.
            /*someOtherFunction($courseValue['courseName'], $courseValue['courseNumber'], $courseValue['creditHours'], $courseValue['maxMarks'], $courseValue['courseType']);
            ...
        }
        ...
    }*/
    ...
}

}

你确定 recordCoursesStudied 方法不是这样的吗?

$this->studentCoursesStudied[] = array(
        'courseName' => $courseName;
        'courseNumber' => $courseNumber;
        'creditHours' => $creditHours;
        'maxMarks' => $maxMarks;
        'courseType' => $courseType;
    ); 

如果 studentCoursesStudied 是一个包含多门课程信息的数组(并且每个数组项都是描述一门课程的字段数组),那将是有意义的。那么你的嵌套 foreach 就有意义了,除了你不能使用 $key 和 $value 作为两个循环的循环变量。