我正在尝试使用PHP中的数组创建哈希映射或二维数组。我的价值观是硬编码的,但这就是我现在所拥有的。我在评论中尝试了代码,但我意识到实际上并没有制作二维数组。
$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'
我关闭的是什么?有人可以帮助我指出正确的方向吗?
答案 0 :(得分:1)
使用多维数组时,通常需要检查现有键,而不是现有值。
您注释掉的代码应该是这样的
if (!array_key_exists($value1['id'],$hash_map)) {
$hash_map[$value1['id']] = array();
}
这将设置外部数组,允许您向其添加元素。
有几种方法可以防止将重复数据放入数组的第二部分。如果我们假设name字段是唯一的,或者我们只想知道唯一的条目,那么
if (!in_array($value2['name'],$hash_map[$value1['id']]) {
$hash_map[$value1['id'][]=$value2['name'];
}
可以正常工作,但是,用户的名字可能不是唯一的(John Smith有人吗?),所以你可能想以某种方式检查$ value2 ['id']。
实现此目的的一种方法是使用$ value2 ['id']作为数组第二部分的键
$hash_map[$value1['id'][$value2['id']]=$value2['name'];
这样可以防止重复密钥存在,因为它们只会相互覆盖。
如果你的内部数组必须从0开始并继续到X,其中X是条目数,那么“exists”数组可能是最好的
$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>";
}
答案 1 :(得分:1)
使用:
if (!in_array(value2['name'], $hash_map[$value1['id']]))
{
hash_map[$value1['id']][] = $value2['name'];
}
这样可以避免添加重复值。