PHP MySql选择数组

时间:2017-03-02 21:43:56

标签: php arrays json mysqli

我有工作代码将结果写入数组,但值加倍。这是代码:

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "databasename";
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 
    $index = array();
    $sql = "SELECT firstname, lastname, ID, parentID FROM table";
    $result = $conn->query($sql);

    while($row = $result->fetch_array()){
    $rows[] = $row;
    }

    // create an index on id
    foreach($rows as $row){
      $index[$row['ID']] = $row;
    }

    // build the tree
    foreach($index as $id => &$row){
      if ($id === 0) continue;
      $parent = $row['parentID'];
      $index[$parent]['children'][] = &$row;
    }
    unset($row);

    // obtain root node
    $index = $index[0]['children'];

    /* free result set */
    $result->close();
    /* close connection */
    $conn->close();

    // output json
    echo json_encode($index, JSON_PRETTY_PRINT);

但它会像这样产生JSON

[
  {
    "0": "Luka",
    "firstname": "Luka",
    "1": "Some",
    "lastname": "Some",
    "2": "287",
    "ID": "287",
    "3": "277",
    "parentID": "277"
},
{
    "0": "John",
    "firstname": "John",
    "1": "Test",
    "lastname": "Test",
    "2": "4080",
    "ID": "4080",
    "3": "277",
    "parentID": "277"
  }
]

有人能告诉我上面的PHP代码有什么问题,所以它不会在JSON中产生双重记录。 谢谢

3 个答案:

答案 0 :(得分:0)

mysqli-&gt; fetch_array()使用MYSQLI_BOTH作为默认结果类型。使用正确的参数来获得您想要的结果。

mixed mysqli_fetch_array ( mysqli_result $result [, int $resulttype = MYSQLI_BOTH ] )

结果类型:

  

此可选参数是一个常量,指示什么类型   应该从当前行数据生成数组。可能   此参数的值是常量MYSQLI_ASSOC,MYSQLI_NUM,   或MYSQLI_BOTH。

     

通过使用MYSQLI_ASSOC常量,此函数将起作用   与mysqli_fetch_assoc()完全相同,而MYSQLI_NUM将表现出来   与mysqli_fetch_row()函数完全相同。最后的选择   MYSQLI_BOTH将创建一个具有两者属性的单个数组。

答案 1 :(得分:0)

更改

$row = $result->fetch_array()

$row = $result->fetch_array(MYSQLI_ASSOC)

答案 2 :(得分:0)

获取结果时,请使用MYSQLI_ASSOC选项。 此外,您可以通过在初始while循环中通过ID立即对其进行索引来保存循环数据。

$sql = "SELECT firstname, lastname, ID, parentID FROM table";
$result = $conn->query($sql);
$index = [];

while(($row = $result->fetch_array(MYSQLI_ASSOC))) {
    $index[$row['ID']] = $row;
}