【问题标题】:Generate PHP array from MySQL with key value from "id" column从 MySQL 生成 PHP 数组,键值来自“id”列
【发布时间】:2015-11-19 13:20:53
【问题描述】:

我有一个如下所示的 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['ID']] = $row;
  • $array[$row['id']] = $row;
  • 如果您是 php 新手,那么我的第一个建议是删除 mysql_* 函数并查看 pdo 和 mysqli
  • 正如他在实际问题中所说的,OP 实际上已经在这样做了
  • @SidneyLiebrand - OP 没有根据原始问题执行此操作,此后添加了该问题.....尽管原始问题没有说明列名中的大小写,这是现在区分大小写的问题

标签: php mysql arrays


【解决方案1】:

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

你要做的就是改变

$array[] = $row

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

您需要确保数据库中的 ID 列是唯一的,以便关联数组不会覆盖键(在这种情况下,只会保留最后一条具有重复 ID 的记录)

编辑(19-11-2015)

还有关于你的“mysql 循环”——它只是一个常规的 PHP while 循环,循环通过 mysql_*mysqli_* 函数给出的记录。您正在循环通过在数据库上执行一条 sql 语句返回的结果,该语句只是以某种方式为您获取和格式化行。

MySQL 和 MySQLi 是两个不同的东西,但它们使用的 SQL 没有什么不同(除了准备好的语句?)。 学习 SQL 是你要做的事情,从现在开始你将使用 mysqli_* 来执行它,因为 mysql_* 函数是 deprecated

我只是想指出这些事情,以消除您可能已经或将来会遇到的一些困惑。 :)

要了解更多关于 mysqli 的信息,请阅读 php.net manual,如果您刚刚开始,这会有点复杂,但没关系 - 了解您能做什么并努力了解您不能做什么。


编辑 2 (19-11-2015)

$row 数组中的索引是case-sensitive,所以IDid 完全不同。一个会加起来一个undefined index 错误。

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

祝你好运!

【讨论】:

  • 谢谢@Sidney - 我已经尝试过了,但不幸的是这不起作用。它返回表中的所有内容,但数组键值仍然从 0 到 3。我的 ID 列设置为具有自动增量和唯一性的整数,所以我认为应该这样做。那我不知道我做错了什么?
  • 这绝对是让它工作的方法@MazeyMazey,我不明白为什么它不会因为我已经做了十亿次。您能否用 new 代码和 new 错误输出更新您的问题?
  • 嗨@Sidney - 没有错误。它可以工作,但是为每个数组结果给出的值从 0 开始编号,而不是表中我的 id 列的值。结果: Array ( [0] => Array ( [text] => Item1 [parentID] => ) 我希望它输出: Array ( [20] => Array ( [text] => Item1 [parentID] => )
  • @MazeyMazey 我完全理解你的问题,这让我很困惑 - 它不应该发生,除非 PHP 中存在一些我非常怀疑的错误
  • @sidneyliebrand op 出于某种未知原因打电话给array_values,所以他自己剥离了数组键
【解决方案2】:

您可以使用 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);

【讨论】:

    【解决方案3】:
    // 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 的情况下正确显示了数组中的内容,但数组键值仍然是数字化的,不幸的是不是 ID 值......
    • 肯定有其他问题,除了我使用 mysqli 而不是 mysql 之外,我已经使用了这个看起来很像的代码一百次
    • 您提到您的 id 是自动递增的,也许它们与数组键的值相同?
    • 它确实有效@Ian,我的意思是它没有错误,但第一个数组值不是ID值:[0] => Array([text] => Item1 [parentID ] => ) [0] 应该是 [20]。
    • 我已经检查过了 - 列中 id 的值是 1,5,59,60,61,62 等,而不是打印时显示的 0,1,2,3数组。
    【解决方案4】:

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

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

    【讨论】:

    • 此代码将生成一个 id 数组,但这不是问题所要求的。
    猜你喜欢
    • 2019-01-01
    • 2021-06-29
    • 2015-01-15
    • 2014-05-29
    • 2012-09-04
    • 2021-12-13
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多