访问关联数组:为什么这个(可能不正确的)代码有效?
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 作为两个循环的循环变量。
问题:
在第二个(以下)代码片段中,在 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 作为两个循环的循环变量。