0

PHP を使用して MySQL テーブルを配列に変換しようとしています。イメージ テーブルの各リスティング ID には少なくとも 1 つのイメージ ID がありますが、イメージ ID の総数は異なる場合があります。

画像テーブル:

|Listing ID | Image ID |
|  1234     |     1    |
|  1234     |     2    |
|  1234     |     3    |
|  1235     |     1    |
|  1235     |     2    |

基本的に、次のようなキーと値のペアを持つ配列に画像テーブルを変換したいと思います。

array([0] 1234 => /FilePath/1234-1::/FilePath/1234-2::/FilePath/1234-3, [1] 1235 => /FilePath/1235-1::/FilePath/1235-2, ...)

ほとんどの場合、このタスクを達成するコードをいくつか書くことができました。ただし、いくつかの問題があります。

私のコードの主な問題は、$lid 配列と $prod 配列に同じ量の要素が含まれていないことです ($prod には $lid よりも 1 つ多くの要素が含まれています)。同じ画像テーブルからデータを取得しているため、同じ数の要素を持つ必要があるため、これは私には困惑しています。

私のコード:

//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);

2 つ目の問題は、foreach ループが実行されるたびに PHP が次のメッセージを返すことです。

注意: 未定義のオフセット: C:\mypath\getimage.php の 78 行目の 2789

2789行目は画像テーブルの最後の行なので、このエラー通知は$lidと$prodの要素数が1ずつ違うことが関係しているのではないかと思います。

どんな提案でも大歓迎です。また、このタスクを達成するためのより効率的な方法を考えられるかどうか教えてください。

ありがとう、

4

2 に答える 2

2

問題の場合:

注意: 未定義のオフセット: C:\mypath\getimage.php の 78 行目の 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 をスローします。

于 2012-12-29T00:08:10.433 に答える
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;
    }
}
于 2012-12-29T00:14:49.660 に答える