Я пытаюсь создать хеш-карту или массив 2d, используя массивы в PHP. Мои значения жестко закодированы, но это то, что у меня есть. Я пробовал код в комментариях, но я понял, что на самом деле не делал 2d-массив.
$hash_map = array();
$query = $this->students_m->getStudentClasses('2');
foreach ($query->result_array() as $key1=>$value1) {
$query2 = $this->students_m->getStudentsInfo('2', '10', '3');
foreach ($query2->result_array() as $key2=>$value2) {
/*
if (!in_array($value2['name'],$hash_map, true)) {
array_push($hash_map, $value2['name']);
}
*/
hash_map[$value1['id']][] = $value2['name'];
}
}
id и student_name - это имена столбцов из таблицы sql. Я запустил этот код и пару его вариантов:
foreach ($hash_map as $student) {
echo $student;
echo "<br>";
}
И я не смог получить правильный результат. Мне бы хотелось, чтобы каждое значение отображалось в виде массива уникальных значений, поэтому пример того, что я собираюсь, выглядит так:
hash_map ['10 '] [0] =' 123 '
hash_map ['10 '] [1] =' 124 '
hash_map ['10 '] [2] =' 125 '
hash_map ['3'] [1] = '123'
hash_map ['3'] [2] = '128'
Я что, близко? Может ли кто-нибудь помочь указать мне в правильном направлении?
При работе с многомерными массивами вы обычно хотите проверить существующие ключи, а не существующие значения.
Ваш прокомментированный код должен быть чем-то вроде этого
if (!array_key_exists($value1['id'],$hash_map)) {
$hash_map[$value1['id']] = array();
}
Это установит внешний массив, позволяя вам добавлять к нему элементы.
Существует несколько способов предотвратить дублирование данных во второй части массива. Если мы предположим, что поле имени уникально, или мы просто хотим знать уникальные записи, тогда
if (!in_array($value2['name'],$hash_map[$value1['id']]) {
$hash_map[$value1['id'][]=$value2['name'];
}
будет работать нормально, однако имена пользователей могут быть не уникальными (Джон Смит кто-нибудь?), и поэтому вы можете вместо этого проверить $ value2 ['id'].
Одним из способов добиться этого было бы использовать $ value2 ['id'] в качестве ключа для второй части массива
$hash_map[$value1['id'][$value2['id']]=$value2['name'];
Это предотвратит существование дублирующих ключей, поскольку они просто перезаписывают друг друга.
Если ваш внутренний массив ДОЛЖЕН начинаться с 0 и продолжать X, где X - количество записей, то массив "существует", вероятно, лучше всего
$exists = array();
if (!in_array($value2['id'],$exists)) {
$hash_map[$value1['id']][]=$value2['name'];
$exists[]=$value2['id'];
}
Тогда для печати вам, вероятно, понадобится что-то вроде:
foreach ($hash_map as $student) {
echo implode(",",$student);
echo "<br>";
}
Использование:
if (!in_array(value2['name'], $hash_map[$value1['id']]))
{
hash_map[$value1['id']][] = $value2['name'];
}
Это позволит избежать дублирования значений.