3

DB からさまざまな値を取得することに触れるトピックは非常に多くありますが、この特定のケースを考慮しているものはないと思います。これらのキーワードに答えるものは何も見つからないので、おそらく問題の説明がより成功するでしょう.

私はこのようなテーブルを持っています:

    | ID   | Name   | Location   | Color   | ...
    ============================================
    | 1    | Apple  | Cupboard   | Red     |
    | 2    | Banana | Fridge     | Yellow  |
    | 3    | Lemon  | Fridge     | Yellow  |
    | 4    | Kiwi   | Drawer     | Green   |
    | 5    | Orange | Basket     | Orange  |
    | 6    | Peach  | Drawer     | Orange  |
    | 7    | Grapes | Fridge     | Purple  |
    | 8    | Lime   | Basket     | Green   |

ご覧のとおり、DB に入力されたとおりに並べられたいくつかの果物の値があります。そのため、彼らの ID はあまり役に立ちません。なぜなら、彼らは果物とその情報の真の組織化を約束していないからです。

私がやっていることは、場所に応じてDBからそれらを引き出すことです。ここまでは順調です。しかし、それはそれほど簡単ではありません。jQuery Masonry を使用してページ全体にデータ ブロックを配布しています。訪問者が、相互に挿入された各場所の果物のサンプルを表示できるようにしたいと考えています。

このテーブルに 100 個以上のアイテムがあるとします。たとえば、場所に応じてアルファベット順に並べると、平均的な視聴者は、たとえば「冷蔵庫」の場所にあるアイテムにたどり着く前に退屈して逃げ出します。したがって、これらの値をインターカレートする必要があります。

SELECTここで、MySQL クエリのレベルでこれを試みましたが、インターカレーションを可能にするコードはないようです。今私は、各場所からすべての値を抽出し、それらをそれぞれ別の配列内に設定すると、おそらく行を同じ # で結合して、それらを次々に配置できると考えています。

たとえば、オレンジとライムの配列 A、アップルの配列 B、キウイとピーチの配列 C、バナナ、レモン、ブドウの配列 D を取得します。したがって、Orange、Apple、Kiwi、および Banana はすべて、それぞれの配列で 1 になります。どういうわけか、おそらくすべての 1 を呼び出して、それらを並べて配置し、4 つのデータ ブロックを出力することができます。それぞれのデータ ブロックには、これらの果物のそれぞれに属するすべての情報がすべての行 1 に含まれています。それぞれの行 2、3 など

しかし、私はこの時点で立ち往生しています。これを行うためにいくつかのコードを考えてみましたが、MySQL からすべての個々の場所をクエリし、個々の配列に設定し、個々のサブ配列に分割するところまで到達しました...しかし、どのようにこれらの個々の配列を番号で「ペアにする」のですか?

これが可能な限り明確な説明であったかどうかはわかりません...申し訳ありません。しかし、あなたが理解し、誰かが私に手を差し伸べることができることを願っています.

おそらく、説明側でより明確にする代わりに、これらすべての最後に取得したいものを示すことができます。これは、場所によって挿入されたすべての値です(ASC最初に来る「Cupboard」を除いて順序付けられます)すべての) および ID でサブオーダーDESC:

ハム!まだ画像投稿させてくれません!そのためには、あと 2 担当者ポイントが必要です。ああ、ここに画像へのリンクがあります。

編集:気にしないでください!わーい!画像を投稿するために必要な担当者ポイントを取得しました。ありがとう!

ここに画像の説明を入力

4

2 に答える 2

2

DB から値を取得し、場所をキーとして設定した配列に配置します。次に、場所/キーを反復処理し、array_shift() を使用して場所/キーごとに 1 つの項目を選択できます。

<?php

$set['cupboard'] = array('apple');
$set['basket'] = array('orange', 'lime');
$set['drawer'] = array('kiwi', 'peach');
$set['fridge'] = array('banana', 'lemon', 'grapes');

$locations = array_keys($set);

$found=true;
while($found) { //as long as there are fruits in at least one array
    $found = false;
    foreach($locations as $row) { //go through all arrays
        $fruit = array_shift($set[$row]); //get the first fruit of the array and delete it from the array
        if(isset($fruit)) { //there is a fruit
            $finalArr[] = $fruit." ($row)"; //add the fruit to the final array
            $found = true; //I found a fruit so keep going
        }
    }
}

var_dump($finalArr);
//Output array(8) { [0]=> string(16) "apple (cupboard)" [1]=> string(15) "orange (basket)" [2]=> string(13) "kiwi (drawer)" [3]=> string(15) "banana (fridge)" [4]=> string(13) "lime (basket)" [5]=> string(14) "peach (drawer)" [6]=> string(14) "lemon (fridge)" [7]=> string(15) "grapes (fridge)" }
?>

お役に立てれば。

編集:ここでは、DB行全体で動作するバージョン

<?php

$dbresult = mysqli_query($dblink, 'SELECT * FROM yourtable');
while ($dbrow = mysqli_fetch_array($dbresult, MYSQLI_ASSOC)) {
    $set[$dbrow['Location']][] = $dbrow;
}

$locations = array_keys($set);

$found=true;
while($found) { //as long as there are fruits in at least one array
    $found = false;
    foreach($locations as $row) { //go through all arrays
        $fruitArr = array_shift($set[$row]); //get the first fruit of the array and delete it from the array
        if(isset($fruitArr)) { //there is a fruit
            $finalArr[] = $fruitArr; //add the whole fruit-array (= row from DB) to the final array
            $found = true; //I found a fruit so keep going
        }
    }
}
于 2013-03-09T06:01:34.553 に答える
0

Thorstenのコードに基づく私の最終的なコードはとても親切でうまくいきました。

Thorstenのコードは、最初に構築されたアレイに対して完全に機能しました。どうもありがとうThorsten!

MySQLDBハンドラーコードから出力されたビルド済みの配列を処理する必要がありました。そのため、Thorstenのコードにいくつかの小さな変更を加える必要がありましたが、今では特定のニーズに対応しています。

これが私の最終的なコードです。Thorstenの元のコードは、下部の彼/彼女の応答にあります。

それが他の人を助けるかもしれないことを願っています!

    <?php

    /* The vars below come from the MySQL DB handler. */
    $set['cupboard'] = $fruits_in_cupboard;
    $set['basket'] = $fruits_in_basket;
    $set['drawer'] = $fruits_in_drawer;
    $set['fridge'] = $fruits_in_fridge;

    $locations = array_keys($set);

    $found=true;
    while($found) { //as long as there are fruits in at least one array
        $found = false;
        foreach($locations as $row) { //go through all arrays
            $fruit = array_shift($set[$row]); //get the first fruit of the array and delete it from the array

            /* Here I include a code to handle every var passed
               through each $fruit sub-array. */
            include('inc/fruity-builder.inc');

            if(isset($fruit)) { //there is a fruit
                /* Here I make a final array out of all $item values. */
                $finalArr[] = array('id'=>$id,'name'=>$name,'location'=>$location,'color'=>$color); //get the first fruit of the array and delete it from the array
                $found = true; //I found a fruit so keep going
            }
        }
    }

    foreach($finalArr as $fruit):

    ?>

    <!-- This is just in order to output our data for each item
         and will surely change according to specific needs. It is
         setup here as an example, following the example I gave
         in the image I posted (above). -->
    <div>
        <h2><?php $fruit['fruit_name'] ?></h2>
        <p>is <?php $fruit['fruit_color'] ?><br />
           and in <?php $fruit['fruit_location'] ?></p>
    </div>

    <?php

    endforeach;

    ?>
于 2013-03-09T19:46:46.347 に答える