Создание хэш-карты в PHP с использованием массива

1

Я пытаюсь создать хеш-карту или массив 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'

Я что, близко? Может ли кто-нибудь помочь указать мне в правильном направлении?

Теги:
arrays

2 ответа

1
Лучший ответ

При работе с многомерными массивами вы обычно хотите проверить существующие ключи, а не существующие значения.

Ваш прокомментированный код должен быть чем-то вроде этого

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>";
}
  • 0
    Я забыл упомянуть, что не должно быть никаких дублирующих ключей, но я хотел бы установить его, чтобы также не было дублированных значений. Внутри цикла if, который у вас есть, могу ли я просто использовать что-то похожее на то, что я прокомментировал выше?
  • 0
    Оба ответа были полезны для получения правильного ответа, но я забыл проверить дубликаты ключей в дополнение к проверке дубликатов значений. Так что я использовал array_key_exists и in_array внутри этого.
Показать ещё 1 комментарий
1

Использование:

if (!in_array(value2['name'], $hash_map[$value1['id']])) 
{ 
  hash_map[$value1['id']][] = $value2['name'];
} 

Это позволит избежать дублирования значений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню