从MySQL生成PHP数组,该数组的键值来自“;id”;柱


Generate PHP array from MySQL with key value from "id" column

我有一个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 )
);

这作为关联数组是可行的。

你所要做的就是改变

$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(19-11-2015)

$row数组中的索引区分大小写,因此IDid完全不同。则将加起来为CCD_ 12错误。

我在您的输出中注意到id键实际上是小写,所以我会尝试更改为小写。

祝你好运!

您可以使用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);
// 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'];
}

以下代码可用于从SQL响应生成一个id数组:

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