【问题标题】:How do I make a Multidimension-Array of MYSQL data via PHP如何通过 PHP 制作 MYSQL 数据的多维数组
【发布时间】:2023-04-01 13:28:01
【问题描述】:

我想从数据库中创建一个包含多维数组的数组。该数据库有3个表格,一张用于车辆,一张用于损坏,一张用于损坏照片。

Table vehicle 有两列 idname

桌子损坏有四列damagesIDvehicleIDdamagesTypedamagesDescription .

table damagesPhotos 有三列 damagesPhotoIDdamagesIDdamagesPhotoUrl

我需要将这三列组合成一个数组,如下所示:

$vehicle = array( 
   "id" => "somestring", 
   "name" => "somestring", 
   "damages" => array( 
       "damagesType" => "somestring", 
       "damagesDescription" => "somestring", 
          "photoOfDamages" => array( 
            "damagesPhotoUrl" => "somestring" 
          ) 
  ) 
); 

我的代码看起来像这样,但工作方式不正确。

$result = mysql_query( "SELECT * from vehicle v LEFT JOIN damages d ON v.id = d.vehicleID LEFT JOIN damagesPhotos p ON d.damagesID = p.damagesID WHERE d.damagesID = p.damagesID AND v.id = 1") or die(mysql_error());  

$rowsResult  = array();

while ($r = mysql_fetch_assoc($result))
    {
        $rowsResult  [] = $r;       
    }

mysql_free_result($result);

echo json_encode($rowsResult);
...

/莫腾

【问题讨论】:

标签: php mysql database multidimensional-array


【解决方案1】:

由于这在 mysql 中是不可能的,所以我们可以编写一个脚本来提供有关特定车辆的所有信息,并使用这些数据,我们可以创建一个数组。 参考以下代码。

$query = "SELECT * from vehicle v LEFT JOIN damages d ON v.id = d.vehicleID LEFT JOIN   damagesPhotos p ON d.damagesID = p.damagesID WHERE d.damagesID = p.damagesID AND v.id = 1";

$result = mysql_query($query);

$i = 0;
$vehicle = array();
while($row = mysql_fetch_array($result)){
      $vehicle[$i] = array( 
        "id" => $row[id], 
        "name" => $row[name], 
        "damages" => array( 
            "damagesType" => $row[damagesType], 
            "damagesDescription" => $row[damagesDescription], 
            "photoOfDamages" => array( 
               "damagesPhotoUrl" => $row[damagesPhotoUrl] 
            ) 
         )
      );
      $i++;
}

【讨论】:

  • 您以 OP 未要求的方式更改了 SQL 查询,使用 INNER JOIN 而不是 LEFT JOIN 可能会导致结果集缺少一些必需的数据.另外,请确保您总是引用关联数组的键。您编写这样的代码的事实告诉我您在错误报告关闭或设置非常低的服务器上进行开发,请确保您的开发服务器在 php.ini 中设置了display_errors=1error_reporting=E_ALL。您在上面的代码中也有语法错误(第 10-11 行)
  • @DaveRandom 是的,我犯了一些语法错误,并相应地进行了更新。但我不认为INNER JOIN会导致结果集。
  • INNER JOIN 将导致 MySQL 不返回在 damagesdamagesPhotos 中没有任何关联记录的行。我非常怀疑这是 OP 想要的。
  • @DaveRandom 也许你是对的。他只能替换 mysql 查询并获得他想要的任何输出。
  • @Vinay 我还是有问题,请看屏幕底部,你能帮我解决这个问题吗?
【解决方案2】:

你不能从 mysql 得到一个多维数组,它只是给你一个二维结果集。您可以获得每行的许多列值。如果您希望它像这样嵌套,则必须在检索结果后处理数组。

类似这样的:

$vehicles = array();

while ($r = mysql_fetch_assoc($result))
{
    $vehicle['id'] = $r['id']; 
    ...
    $damage = array();
    $damage['damagesType'] = $r['damagesType'];
    ...
    $vehicle['damages'] = $damage;
    ...
    array_push($vehicles, $vehicle);      
}
echo json_encode($vehicles);

【讨论】:

    【解决方案3】:

    这里不可能让 MySQL 为您完成所有工作(嗯, 可以让 MySQL 完成大部分的工作,但不要) 因为来自 MySQL 或任何 SQL 驱动的数据库的结果集可以恰好有两个维度。第一个维度是行的集合,第二个维度是每一行的列的集合。

    基于示例目标数据结构,您有两种选择:

    1. 获取初始结果集 (vehicle LEFT JOIN damages) 并对其进行迭代,运行查询以获取照片
    2. 按照您当前的操作将所有表连接在一起,并将其后处理成所需的多维结构。

    这是一个折衷方案 - 选项 1 会导致更多的数据库流量,但检索的数据不超过所需的数据,而选项 2 将其减少为具有较少数据库流量的单个查询,但检索的数据多于所需的数据,因为每个照片行携带整车数据。

    选项 1 将是使用准备好的语句的主要候选者,这是您无法利用 mysql_* 函数的优势。您应该改用PDOMySQLi。我个人推荐PDO。这样做还有许多其他原因,包括有一天 MySQL 扩展将从 PHP 中删除,正确使用准备好的语句可以完全消除通过用户输入进行 SQL 注入导致的任何安全问题风险。

    我可能会推荐选项 2。

    【讨论】:

      【解决方案4】:

      感谢Vinay,我的阵列看起来像这样。太好了:)

      [{"vehilceId":"1",
      "name":"AW55005",
      "damages":{
          "damagesType":"Exterior",
          "damagesDescription":"Rust",
          "photoOfDamages":{
              "damagesPhotoUrl":"link to damagesPhoto 01"
              }
          }
      },
      
      {"vehilceId":"1",
      "name":"AW55005",
      "damages":{
          "damagesType":"Exterior",
          "damagesDescription":"Rust",
          "photoOfDamages":{
              "damagesPhotoUrl":"link to damagesPhoto 02"
              }
          }
      },
      
      {"vehilceId":"1",
      "name":"AW55005",
      "damages":{
              "damagesType":"Interior",
              "damagesDescription":"Scratch",
              "photoOfDamages":{
                  "damagesPhotoUrl":"link to damagesPhoto 03"
                  }
              }
      }
      

      但正如您所见,前两个对象是相同的,只是damagesPhotoUrl 不同。 如何合并这两个数组,使其看起来像这样:

      {"vehilceId":"1",
      "name":"AW55005",
      "damages":{
          "damagesType":"Exterior",
          "damagesDescription":"Rust",
          "photoOfDamages":{
              {"damagesPhotoUrl":"link to damagesPhoto 01"},
              {"damagesPhotoUrl":"link to damagesPhoto 02"}
          }
          }
      }, ...
      

      /莫腾

      【讨论】:

      • 我已经添加了相同的新答案。他们是您想要做的一些问题(这是不可能的)。所以我在新的答案中讨论了这些问题。
      【解决方案5】:

      在解决了你的主要问题之后。我正在为新问题写这篇文章。据我所知,您不能将值分配给数组中的相同键,这意味着您不能允许有重复的键。因为如果多个可以具有相同的键,您将如何访问所需的值。这就是为什么您可以选择另一种方式来合并您的价值。按以下方式重新排列您的阵列。

      $key = "damagesPhotoUrl";
      $value = "link to damagesPhoto 01";
      $array[$key][] = $value;
      

      然后您可以通过以下方式访问它:

      echo $array[$key][0];
      echo $array[$key][1];
      

      【讨论】:

        【解决方案6】:

        已经很晚了....但是如果您使用 PDO,那么 PDO::FETCH_COLUMN 和 PDO::FETCH_GROUP 可以生成 3 维数组。 我认为它是有限的,我不是很懂 SQL,但是说“你不能从 mysql 获取多维数组......或任何 SQL 驱动的数据库 - 可以有两个维度”可能不太正确。

        对不起我的英语和题外话(这个问题是关于mysql,而不是pdo)

        http://php.net/manual/en/pdostatement.fetchall.php

        (伪数组):

        array(
          array(//group 1
            array(
              0=>item1,
              0=>item2...
              )
            array(
              0=>item1,
              0=>item2...
              )
            array(
              0=>item1,
              0=>item2...
              )
            array(
              0=>item1,
              0=>item2...
              )
          )...
          array(//group 2
            array(
              0=>item1,
              0=>item2...
              )
            array(
              0=>item1,
              0=>item2...
              )
           )...
        ) 
        

        【讨论】:

          猜你喜欢
          • 2017-06-14
          • 2012-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多