我正在尝试使用PHP将MySQL表转换为数组。图像表中的每个列表ID至少有一个图像ID,但图像ID的总数可能不同。
图像表:
|Listing ID | Image ID |
| 1234 | 1 |
| 1234 | 2 |
| 1234 | 3 |
| 1235 | 1 |
| 1235 | 2 |
基本上,我想将Image Table转换为具有键值对的数组,如下所示:
array([0] 1234 => /FilePath/1234-1::/FilePath/1234-2::/FilePath/1234-3, [1] 1235 => /FilePath/1235-1::/FilePath/1235-2, ...)
我已经能够编写一些代码,这些代码在很大程度上完成了这项任务。但是,有一些问题。
我的代码的主要问题是$ lid数组和$ prod数组不包含相同数量的元素($ prod包含比$ lid更多的元素)。这让我感到困惑,因为他们从同一个图像表中提取数据,因此应该有相同数量的元素。
我的代码:
//Set document path
$target_path = realpath($_SERVER['DOCUMENT_ROOT']). "\mypath\image\uploads\\";
//Query to download all listing IDs in Markers table
$query = $db->query("SELECT * FROM image");
while ($row = $query->fetch(PDO::FETCH_BOTH)) {
$temp[] = $row;
}
foreach($temp as $i=>$v){
$line = $target_path.$v['L_ListingID']."-".$v['L_ImageID'].".jpg";
if($temp[$i]['L_ListingID']==$temp[$i+1]['L_ListingID']){
//appending '::' to each string in the $prod array
$prod[] = $line."::";
}else{
// * will serve as the delimiter in the $prod array
$prod[] = $line."*";
//Add each listing ID into Listing Array
$lid[] = $v['L_ListingID'];
}
}
//Convert the array into a big string
$bigString = implode("", $prod);
//Chop up the big string into sections delimited by '*' and insert into 'prod' array
$prod = explode("*",$bigString);
//Combine $lid array with $prod array
$combo = array_combine($lid, $prod);
第二个问题是,只要运行foreach循环,PHP就会返回以下消息:
注意:未定义的偏移量:第78行的C:\ mypath \ getimage.php中的2789
第2789行是图像表中的最后一行,所以我认为这个错误通知可能与$ lid和$ prod的元素数量差异为1的事实有关。
非常感谢任何建议。另外,如果您能想出更有效的方法来完成此任务,请告诉我。
谢谢,
答案 0 :(得分:2)
对于这个问题:
注意:未定义的偏移量:第78行的C:\ mypath \ getimage.php中的2789
这是因为你在做:
if($temp[$i]['L_ListingID']==$temp[$i+1]['L_ListingID']){
即使您的$i+1
位于最后一个元素上,也需要foreach
。
您需要检查是否存在$i+1
密钥,请将其替换为:
if(array_key_exists($i+1, $temp) && ($temp[$i]['L_ListingID']==$temp[$i+1]['L_ListingID'])){
对于“主要”问题,您的代码太复杂了。如果你开始摇动字符串和数组,那就有问题了。仅使用字符串或仅使用数组,但不能同时使用两者,这将更难维护。
$bigstring = '';
$lid = array()
foreach($temp as $i=>$v){
$bigstring .= $target_path.$v['L_ListingID']."-".$v['L_ImageID'].".jpg";
if(array_key_exists($i+1, $temp) && ($temp[$i]['L_ListingID']==$temp[$i+1]['L_ListingID'])) {
$bigstring .= "::";
}else{
$bigstring .= "*";
}
if (!in_array($v['L_ListingID'], $lid)) {
$lid[] = $v['L_ListingID'];
}
}
最后一件事:在对变量使用数组运算符之前初始化数组是一个很好的做法。
$temp = array();
while ($row = $query->fetch(PDO::FETCH_BOTH)) {
$temp[] = $row;
}
否则,PHP将抛出E_NOTICE。
答案 1 :(得分:1)
使用此算法,您必须为最后一行创建一个特殊情况(这会导致通知“未定义的偏移量”,如Ninsuo所示)。
以下算法应构建您期望的数组:
$combo = array();
foreach($temp as $v){
$line = $target_path.$v['L_ListingID']."-".$v['L_ImageID'].".jpg";
$key = $v['L_ListingID'];
if (array_key_exists($key, $combo)) {
// Append
$combo[$key] .= '::' . $line;
} else {
// Create key
$combo[$key] = $line;
}
}