使用MySQL中的"id"列生成PHP数组,键值对应。

4

我有一个MySQL数据库,看起来像这样:

ID        TEXT        PARENTID
20        Item1        null
23        Item2        20
27        Item3        20
80        Item4        27

我希望能够以以下数组的形式检索到这些数据:
Array ( 
[20] => Array ( [text] => Item1 [parentID] => ) 
[23] => Array ( [text] => Item2 [parentID] => 20 ) 
[27] => Array ( [text] => Item3 [parentID] => 20 ) 
[80] => Array ( [text] => Item4 [parentID] => 27 )
);

请注意,键值代表表中id列的值。
我曾在mysql循环内部尝试制作一个数组(我仍在学习MySQLi,并希望它很快会掌握,但是这个示例是在旧的MySQL中完成的)。
$hent_folder = mysql_query("SELECT id, text, parentID FROM folders");   
while($row = mysql_fetch_assoc($hent_folder))
    {
        $array[] = $row;
    }

这里生成的结果当然是“自动”的键值,而不是所需的ID列的值,并将ID列作为内部数组的一部分。

有没有方法或解决方法可以成功呢?

我希望有人能指引我正确的方向...

-----编辑------

我已经替换了

$array[] = $row;

使用

$array[$row['ID']] = $row;

但它仍然没有返回所需的结果,它返回的是:
Array ( 
[0] => Array ( [id] => 20 [text] => Item1 [parentID] => ) 
[1] => Array ( [id] => 23 [text] => Item2 [parentID] => 20 ) 
[2] => Array ( [id] => 27 [text] => Item4 [parentID] => 20 ) 
[3] => Array ( [id] => 80 [text] => Item4 [parentID] => 27 )
);

3
$array[$row['ID']] = $row; - Mark Baker
1
$array[$row['id']] = $row; - Steve
如果你是 PHP 新手,我的第一个建议是放弃使用 mysql_* 函数,转而学习 pdo 和 mysqli。 - Millard
OP在他的问题中已经这样做了,各位先生。mysql_*mysqli_*并没有太大的区别,但是并不是每个人都有同样的经验,否则我们也不需要SO了。 - SidOfc
@SidneyLiebrand - 根据最初的问题,OP没有这样做,但是现在已经添加了.....尽管原始版本没有表明列名称的大小写,但现在这是一个大小写敏感的问题。 - Mark Baker
@MarkBaker,那么我道歉了。在发表评论之前,我应该先检查一下的。 - SidOfc
4个回答

6
这可以使用关联数组完成。
你需要做的就是将 $array[] = $row
改为 $array[$row['ID']] = $row
确保数据库中的 ID 列是唯一的,以便关联数组不会覆盖键(否则只有具有重复 ID 的最后一条记录将保留)。
编辑(19-11-2015)
还有关于你的“mysql循环” - 它只是一个常规的 PHP while 循环,通过 mysql_* 或 mysqli_* 函数提供的记录循环。您正在循环执行对数据库上的 SQL 语句返回的结果,该结果仅以特定方式获取和格式化行。
MySQL和MySQLi是两个不同的东西,但它们使用的SQL并没有什么不同(除了可能是预处理语句?)。 学习SQL是你现在要做的事情,为了执行它,你将从现在开始使用mysqli_*,因为mysql_*函数已经弃用
我只是想指出这些事情,以消除您可能已经或将来会有的一些困惑。 :)
有关mysqli的更多阅读,请阅读php.net手册,如果你刚开始学习,那么所有的都有点复杂,但没关系 - 理解你能理解的,并努力理解你不能理解的。

编辑2 (2015年11月19日)

您的$row数组中的索引是区分大小写的,因此IDid完全不同。其中一个将导致未定义的索引错误。

我注意到在您的输出中,id键实际上是小写的,因此我建议尝试更改为那个。

祝你好运!


谢谢@Sidney - 我已经尝试过了,但不幸的是这并不起作用。它返回表中的所有内容,但仍带有从0到3的数组键值。我的ID列设置为整数,具有自动增量和唯一性,所以我认为应该可以解决问题。那我做错了什么呢? - MazeyMazey
这绝对是让它工作的方法@MazeyMazey,我不明白为什么不行,因为我已经做了无数次。你能否更新你的问题,包括新的代码和新的错误输出? - SidOfc
嗨@Sidney - 没有错误。它可以工作,但是每个数组结果给定的值都是从0开始编号的,而不是我的表中id列的值。 结果: Array([0] => Array([text] => Item1 [parentID] =>)) 我希望它输出: Array([20] => Array([text] => Item1 [parentID] =>)) - MazeyMazey
感谢@Sidney - 我尝试将代码应用到项目中,使用$array[$row['ID']] = $row时它可以工作,即使通过print_r($array)打印出来的是一组索引键。 谢谢你的帮助! - MazeyMazey
1
@sidneyliebrand 操作正在出于某些未知原因调用 array_values,因此他自己在去除数组键。 - Steve
显示剩余4条评论

3

您可以轻松使用PDO实现此结果。它有一个名为PDO::FETCH_GROUP的获取模式,当与PDO::FETCH_ASSOC结合使用时,将为您生成所需的数组。

$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass, [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

$stmt = $pdo->prepare('SELECT id, text, parentID FROM folders');
$stmt->execute();
$array = $stmt->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);

0
// Multidimensional array. 
// main array by id with text and parent in secondary array
// tryed going by the second diagram

$arr = array();
$hent_folder = mysql_query("SELECT id, text, parentID FROM folders");

while($row = mysql_fetch_array($hent_folder))
{
    $arr[$row['id']]['text']     = $row['text'];
    $arr[$row['id']]['parentID'] = $row['parentID'];
}

谢谢 @Ian - 这确实显示了数组内的内容,但是遗憾的是数组键值仍然是数字而不是ID值... - MazeyMazey
除了我使用mysqli而不是mysql之外,肯定还有其他问题,我已经用过这个看起来完全一样的代码一百次了。 - Ian Thompson
你提到你的ID是自动递增的,也许它们与数组键相同? - Ian Thompson
它确实可以工作@Ian,我的意思是它没有错误,但第一个数组值只是不是ID值:[0] => Array([text] => Item1 [parentID] =>)[0]应该是[20]。 - MazeyMazey
我已经检查过了 - 列中的 ids 值为 1、5、59、60、61、62 等,而不是打印数组时显示的 0、1、2、3。 - MazeyMazey
我很困惑,如果答案在你找到它之前没有出现在这个帖子中,请留下评论告诉我具体出了什么问题。谢谢。@MazeyMazey - Ian Thompson

-1
以下代码可用于生成SQL响应中ID的数组:
$ids_array = array();

foreach($idsFromDb as $row)
{
    $ids_array[] = $row['id'];
}

echo print_r($ids_array[0]) ;

1
这段代码将生成一个ID数组,但这不是问题所要求的。 - Jason Aller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接