3

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

我有一张很像这样的桌子:

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

可以看出,有几个水果值按照它们输入到数据库的方式排序。所以他们的身份证对我们没有多大帮助,因为他们承诺不会真正组织水果和他们的信息。

我正在做的是根据位置将它们从数据库中取出。到目前为止一切都很好。然而,事情并没有那么容易。我正在使用 jQuery Masonry 将我的数据块分布在整个页面中,并且我希望访问者能够查看每个位置的水果样本,这些样本相互插入。

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

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

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

但是,我被困在这一点上。我已经尝试提出几个代码来做到这一点,但我已经从 MySQL 查询了所有单独的位置,然后设置为单独的数组,然后分成单独的子数组......但是如何我应该按数字“配对”这些单独的数组吗?

我不确定这是否是最清楚的解释......对此感到抱歉。但我确实希望你能理解并且有人可以帮我一把。

也许,为了在解释方面更清楚,我可以向您展示我想在这一切结束时获得什么,这是所有按位置插入的值(排序ASC,“橱柜”除外,它将首先出现全部)并按 ID 排序DESC

哼!还不让我发图片!为此,我还需要 2 个代表点!哦,好吧,这里有图片的链接。

编辑:没关系!耶!得到了我需要发布图片的代表点。谢谢!

在此处输入图像描述

4

2 回答 2

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

希望这可以帮助。

编辑:这里有一个版本,它适用于整个 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 的代码非常适合一开始构建的数组。非常感谢托尔斯滕!

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