从MySQL数据库中获取的值(或以有组织的方式“洗牌”)值

时间:2013-03-09 03:16:41

标签: php jquery mysql jquery-masonry

有很多主题涉及从数据库中获取不同的值,但我认为没有人会考虑这个特定的情况。我找不到任何可以回答这些关键词的内容,所以也许对这个问题的解释会有更大的成功。

我的桌子很像这样:

    | 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的方式排序。所以他们的身份证对我们没什么帮助,因为他们承诺没有真正的组织结果及其信息。

我正在做的是根据位置将它们带出数据库。一切都很顺利。但是,它并不那么容易。我正在使用jQuery Masonry在页面上分发我的数据块,我希望访问者能够查看每个位置插入的水果样本。

让我们假设这张桌子有100多个项目。例如,如果我只是根据位置按字母顺序对它们进行排序,那么普通观众将会在他或她到达“冰箱”位置的那些项目之前感到无聊和逃跑。所以我真的需要插入这些值。

现在,我已经在MySQL查询级别尝试了这个,但似乎没有任何允许插入的SELECT代码。现在我想,如果我从每个位置提取所有值并将它们分别设置在一个单独的数组中,那么我就可以将具有相同#的行联合起来并将它们一个接一个地放在一起。

例如,我使用Orange和Lime获得Array A,然后使用Apple获得Array B,使用带有Kiwi和Peach的Array C,然后使用Banana,Lemon和Grapes获得Array D.所以Orange,Apple,Kiwi和Banana在他们各自的阵列中都是1。不知何故,我或许可以调用所有1并将它们并排放置,以便打印我们的4个数据块,每个数据块都包含属于所有相应行中每个水果的所有信息。然后,我可以为所有行做同样的事情。各行2,3等等

然而,我在这一点上陷入困​​境。我已经尝试了几个代码来做到这一点,但我到达了我从MySQL查询所有单独位置,然后设置为单个数组,然后,分成单个子数组...但如何我可以用数字“配对”这些单独的数组吗?

我不确定这是否是最清楚的解释......对不起。但我希望你能理解,也许有人可以帮我一把。

也许,为了更清楚地说明解释方面,我可以向您展示我想在所有这些内容中获得的内容,即所有按位置插入的值(有序ASC除外“橱柜”,将首先出现)并按ID DESC进行子订购:

哼!不让我发布图片了!我还需要2个代表点!哦,here you have a link to the image.

编辑:没关系!好极了!得到了我需要发布图像的重复点。谢谢!

enter image description here

2 个答案:

答案 0 :(得分:2)

从数据库中获取值并将它们放在一个数组中,在该数组中将位置设置为键。您可以遍历位置/键然后使用array_shift()为每个位置/键选择一个项目:

<?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)" }
?>

希望这有帮助。

编辑:这是一个版本,适用于整个数据库行

<?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
        }
    }
}

答案 1 :(得分:0)

我的最终代码基于代码Thorsten非常友善。

Thorsten的代码完美地适用于最初构建的阵列。 非常感谢Thorsten!

我需要处理从MySQL数据库处理程序代码输出的预构建数组。所以我不得不对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;

    ?>