2013-03-09 1 views
3

Существует очень много тем, которые касаются получения разных значений из БД, но я думаю, что это не совсем учитывает этот конкретный случай. Я не могу найти ничего, что отвечает на эти ключевые слова, поэтому, возможно, объяснение проблемы будет иметь больший успех.Интеркалирование (или «перетасовка» организованным способом) значения, полученные из базы данных MySQL

У меня есть таблица много, как эта:

| 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 с киви и персиком, а затем Array D с бананом, лимоном и виноградом. Таким образом, Orange, Apple, Kiwi и Banana будут 1 в своих соответствующих массивах. Так или иначе, я мог бы называть все 1s и ставить их бок о бок, чтобы он печатал наши 4 блока данных, каждый со всей информацией, которая принадлежит каждому из этих фруктов во всех соответствующих строках 1. Тогда я мог бы сделать то же самое для всех соответствующие строки 2, 3 и т. д. и т. д.

Однако я застрял в этом пункте. Я попытался придумать пару кодов, чтобы сделать это, но я дошел до того, что у меня есть все отдельные запросы, заданные из MySQL, а затем настроены на отдельные массивы и затем разделяются на отдельные подмассивы ... но как «Я объединяю» отдельные массивы по числу?

Я не уверен, что это было самое ясное объяснение ... Извините. Но я надеюсь, что вы поймете, и кто-то может дать мне руку.

Возможно, вместо большей ясности в пояснительной части я могу показать вам, что я хотел бы получить в конце всего этого, то есть все значения, интеркалированные по местоположению (упорядочено ASC, за исключением «Шкаф», , который будет в первую очередь) и подзадачи по ID DESC:

Hum! Не позволяет мне отправлять изображения! Мне нужно еще 2 пункта для этого! О хорошо, here you have a link to the image.

EDIT: Ничего! Ура! Получил реплики, которые мне нужно, чтобы отправить изображение. Благодаря!

enter image description here

+1

Вы продолжаете использовать это слово, я не думаю, что это означает, что вы думаете, что это значит. – ultranaut

+0

@ultranaut - Послушайте, все, что вам нужно сделать, это интеркалировать между строками, и его смысл будет ясен. – anon

+0

Какое слово, ультранут? – QuestionerNo27

ответ

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

Надеются, что это помогает.

EDIT: Вот версия, которая работает с целыми 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 
     } 
    } 
} 
+0

Эй, Торстен! Ты спасибо! Как бы то ни было, он отлично работает! Тем не менее, я не могу заставить его работать с массивами обработки, которые я предварительно создал во время процесса запроса БД. Я продолжаю получать: '[0] => строка (13)« Массив (шкаф) »[1] => строка (13)« Массив (корзина) »[2] => строка (13)« Массив (ящик) » [3] => строка (13) «Массив (холодильник)» [3] => строка (13) «Массив (корзина)». , .'. Я думаю, что мне нужно найти, где я устанавливаю массивы для каждого ключа местоположения, т. Е .: '$ set ['basket'] = $ basket_items;'. Я пробовал пару вещей, но он не работает. Как мне нужно обрабатывать var '$ basket_items'? – QuestionerNo27

+0

Или еще одна мысль: как я должен обрабатывать на другом конце вашего кода каждый отдельный суб-массив, который я получаю от него? (P.S. Это, как есть, конечно, было очень полезно! **) – QuestionerNo27

+0

O.K.! Кажется, я решил это. Я очищу его и отправлю сюда, если все будет хорошо! Опять же, миллион спасибо, Торстен! – QuestionerNo27

0

Мой окончательный код, основанный на коде Торстен был настолько любезен, что получилось.

Код Thorsten отлично работал для массивов, построенных с самого начала. Большое спасибо Thorsten!

Мне нужно было обработать предварительно построенные массивы, которые были выведены из моего кода обработчика DB DB. Поэтому мне пришлось сработать несколько небольших изменений в коде 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; 

    ?>