有没有" mysqli_fetch_all"使用列(PK)作为结果数组中的索引?

时间:2014-03-29 21:31:24

标签: php arrays mysqli

目前我有一些效果:

<?php

  // ...More Code

  $result = mysqli_query($mysqli, "SELECT * FROM stock_types");
  if(!$result || mysqli_num_rows($result) < 1) die('error');
  $stock_types = mysqli_fetch_all($result, MYSQLI_ASSOC);
  mysqli_free_result($result);
  die(print_r($stock_types,true));

  // More Code...

?>

将输出效果:

Array (
  [0] => Array (
    [type_id] => 1
    [type_name] => In Stock
    [type_visible] => 1
    [type_locked] => 0
  )
  [1] => Array (
    [type_id] => 2
    [type_name] => Out of Stock
    [type_visible] => 1
    [type_locked] => 1
  )
  [2] => Array (
    [type_id] => 3
    [type_name] => Offline
    [type_visible] => 0
    [type_locked] => 1
  )
  [3] => Array (
    [type_id] => 5
    [type_name] => Hidden
    [type_visible] => 0
    [type_locked] => 0
  )
)

是否存在mysqli提取过滤器(正确的术语?),如果存在数组索引值,它将使用结果集中的主键?如果我的问题不明确,那将会产生一些影响他的效果:

Array (
  [1] => Array (
    [type_name] => In Stock
    [type_visible] => 1
    [type_locked] => 0
  )
  [2] => Array (
    [type_name] => Out of Stock
    [type_visible] => 1
    [type_locked] => 1
  )
  [3] => Array (
    [type_name] => Offline
    [type_visible] => 0
    [type_locked] => 1
  )
  [5] => Array (
    [type_name] => Hidden
    [type_visible] => 0
    [type_locked] => 0
  )
)

删除type_id值并不重要,但如果可以使用主键索引数组,那么它将非常有用。我可以用一个fetch循环来做这个,但我想知道是否有更简单更优雅的方法来处理它。

3 个答案:

答案 0 :(得分:4)

在ext / mysqli中没有方便的功能。但是您可以通过逐个获取行并将它们放入正确的数组键中以您想要的方式构建数组:

此示例假定主键是第一列:

$set = array();
while ($row = $result->fetch_assoc()) {
    $set[array_shift($row)] = $row;
}

要使用fetch_all(),您可以处理提取的while数据集:

$set = array();
$data = $result->fetch_all(); 
while ($row = array_shift($data)) {
    $set[array_shift($row)] = $row;
}

答案 1 :(得分:2)

这正是我正在寻找的,这是标准php函数的简单示例。这只适用于您的数组长度为2的情况。

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => xxx
        )

    [1] => Array
        (
            [id] => 2
            [name] => yyy
        )
)

您可以使用以下功能制作以下格式:array_column

Array
(
    [1] => xxx
    [2] => yyy
)

代码示例:

$result_set = mysqli_fetch_all($restult_set , MYSQLI_ASSOC);
//syntax: array_column(arg, column_key, index_key)
$result_set = array_column($result_set, 'name' , 'id');

如果你只有两个长度的数组,这很有效,节省了很多mysqli调用,反对在while循环中使用它作为mysqli_fetch。希望这可能是有用的。

答案 2 :(得分:0)

你考虑过一些自动化是件好事。大多数PHP用户从不费心去思考这些问题。让我建议你my library我专门为解决这个以及mysqli的许多其他不便而写的。当然,它有一个现成的功能。

请注意获取阵列所需的代码量:不超过一行

$stock_types = $db->getInd('type_id', "SELECT * FROM stock_types");
print_r($stock_types);die;

几乎所有其他数据库交互所需的代码量完全相同。即使在某些变量必须添加到查询中的情况下,这将需要原始的mysqli大量的不断重复的代码(你肯定使用mysqli的参数,不是吗?)。

例如,这是我的最爱之一:

$data = $db->getAll("SELECT * FROM ?n WHERE id IN (?a) LIMIT ?i",$table,$ids,$limit);

如果正确地执行并且安全,那将只需要大量的原始mysqli代码。虽然使用正确编写的抽象库但它仍然不超过一行