1

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

表车辆有两列idname

表damages有四列damagesIDvehicleIDdamagesTypedamagesDescription

表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);
...

/莫腾

4

6 回答 6

4

由于这在 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++;
}
于 2012-08-31T07:38:26.047 回答
2

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

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

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

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

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

我可能会推荐选项2。

于 2012-08-31T07:35:16.673 回答
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);
于 2012-08-31T07:28:46.970 回答
0

感谢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"}
    }
    }
}, ...

/莫腾

于 2012-08-31T18:47:23.810 回答
0

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

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

然后你可以访问它:

echo $array[$key][0];
echo $array[$key][1];
于 2012-09-03T05:27:46.103 回答
0

很晚了....但是如果您使用 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...
      )
   )...
) 
于 2013-08-10T20:58:49.277 回答