2015-02-20 2 views
1

Ниже я добавил $ var_dump массива, который я создал посредством пользовательских действий с использованием HTML-формы.Сортировка и отображение значений систематически из многомерного массива PHP

Я, конечно же, желаю рассмотреть другие стратегии для достижения конечного эффекта (и я не был, если честно, позитивным, что это не будет лучше достигнуто с помощью функций WordPress, поскольку именно в этой среде возникает эта проблема) , но самым простым ответом было бы взять массив, описанный ниже, избавиться от ответов «NULL», а затем по алфавиту ВСЕ из оставшихся наборов по фамилии (которые я изначально ставил первым, так как в более ранней аналогичной версии той же задачи это случилось, чтобы сделать окончательный вид щелчком).

Выход будет отображаться в списке входных данных в событии с первым номером столбца, вторым столбцом с указанием имени и фамилии под компанией, подписи, строки, описывающей тип «билет», и Стоимость билета.

SO, просто чтобы сделать его легко представить:

Номер ПЕРВОЙ/LAST/компания ПОДПИСЬ БИЛЕТ ТИП ЦЕНА

(#) Ого Abrams, Carolco ......... член $ 5

Естественным способом сделать это для меня было создание таблицы HTML, в которой каждая переменная, расположенная под каким-то индексом, выводится через PHP. У меня были некоторые версии, которые ALMOST работали, включая петли foreach в самых пределах моего понимания манипуляции с массивами.

Я подозреваю, что человек, который может ответить на мой вопрос, мог написать то, что я пробовал в его или ее сне, но просто чтобы дать вкус, не сбрасывая в кучу больше кода ... получив нижний массив в переменную, называемую $ meta, я мог бы пропустить ее через foreach ($meta as $reservation), затем напечатать некоторые из переменных, но не все из них, а не все в правильном порядке, например, $reservation['first_name'][0]. Я попытался сбросить $ i вместо [0] и обманывать другими комбинациями ключ/значение/итератор, но на этом этапе я просто повторяю свой собственный внутренний массив ок. 999 неправильных vs 1 правильных решений.

Я знаю, что это общий тип вопроса, но в поиске через темы здесь я еще не нашел такую ​​версию, как этот, на который прямо ответил.

array(8) { 
    [0]=> 
    array(5) { 
    ["last_name"]=> 
    NULL 
    ["first_name"]=> 
    NULL 
    ["price"]=> 
    NULL 
    ["company"]=> 
    NULL 
    ["ticket_type"]=> 
    NULL 
    } 
    [1]=> 
    array(5) { 
    ["last_name"]=> 
    array(3) { 
     [0]=> 
     string(6) "Winger" 
     [1]=> 
     string(6) "Dinger" 
     [2]=> 
     string(7) "Stassen" 
    } 
    ["first_name"]=> 
    array(3) { 
     [0]=> 
     string(5) "Debra" 
     [1]=> 
     string(3) "Hum" 
     [2]=> 
     string(6) "Harold" 
    } 
    ["price"]=> 
    array(3) { 
     [0]=> 
     string(2) "10" 
     [1]=> 
     string(2) "10" 
     [2]=> 
     string(4) "6.35" 
    } 
    ["company"]=> 
    array(3) { 
     [0]=> 
     string(14) "Post Data Test" 
     [1]=> 
     string(14) "Post Data Test" 
     [2]=> 
     string(14) "Post Data Test" 
    } 
    ["ticket_type"]=> 
    array(3) { 
     [0]=> 
     string(16) "Shippable Ticket" 
     [1]=> 
     string(16) "Shippable Ticket" 
     [2]=> 
     string(14) "Special Ticket" 
    } 
    } 
    [2]=> 
    array(5) { 
    ["last_name"]=> 
    NULL 
    ["first_name"]=> 
    NULL 
    ["price"]=> 
    NULL 
    ["company"]=> 
    NULL 
    ["ticket_type"]=> 
    NULL 
    } 
    [3]=> 
    array(5) { 
    ["last_name"]=> 
    array(3) { 
     [0]=> 
     string(9) "Mightwork" 
     [1]=> 
     string(1) "u" 
     [2]=> 
     string(3) "why" 
    } 
    ["first_name"]=> 
    array(3) { 
     [0]=> 
     string(9) "Bizarrely" 
     [1]=> 
     string(11) "whatsamatta" 
     [2]=> 
     string(8) "done no " 
    } 
    ["price"]=> 
    array(3) { 
     [0]=> 
     string(1) "5" 
     [1]=> 
     string(4) "12.7" 
     [2]=> 
     string(4) "12.7" 
    } 
    ["company"]=> 
    array(3) { 
     [0]=> 
     string(13) "Get Data Test" 
     [1]=> 
     string(13) "Get Data Test" 
     [2]=> 
     string(13) "Get Data Test" 
    } 
    ["ticket_type"]=> 
    array(3) { 
     [0]=> 
     string(16) "Shippable Ticket" 
     [1]=> 
     string(14) "Special Ticket" 
     [2]=> 
     string(14) "Special Ticket" 
    } 
    } 
    [4]=> 
    array(5) { 
    ["last_name"]=> 
    NULL 
    ["first_name"]=> 
    NULL 
    ["price"]=> 
    NULL 
    ["company"]=> 
    NULL 
    ["ticket_type"]=> 
    NULL 
    } 
    [5]=> 
    array(5) { 
    ["last_name"]=> 
    array(2) { 
     [0]=> 
     string(7) "Marlatt" 
     [1]=> 
     string(7) "Stewart" 
    } 
    ["first_name"]=> 
    array(2) { 
     [0]=> 
     string(4) "Jeff" 
     [1]=> 
     string(3) "Al " 
    } 
    ["price"]=> 
    array(2) { 
     [0]=> 
     string(1) "0" 
     [1]=> 
     string(1) "0" 
    } 
    ["company"]=> 
    array(2) { 
     [0]=> 
     string(23) "Jeff Marlatt Consulting" 
     [1]=> 
     string(23) "Jeff Marlatt Consulting" 
    } 
    ["ticket_type"]=> 
    array(2) { 
     [0]=> 
     string(16) "testing defaults" 
     [1]=> 
     string(16) "testing defaults" 
    } 
    } 
    [6]=> 
    array(5) { 
    ["last_name"]=> 
    NULL 
    ["first_name"]=> 
    NULL 
    ["price"]=> 
    NULL 
    ["company"]=> 
    NULL 
    ["ticket_type"]=> 
    NULL 
    } 
    [7]=> 
    array(5) { 
    ["last_name"]=> 
    array(3) { 
     [0]=> 
     string(10) "Flintstone" 
     [1]=> 
     string(10) "Flintstone" 
     [2]=> 
     string(6) "Rubble" 
    } 
    ["first_name"]=> 
    array(3) { 
     [0]=> 
     string(4) "Fred" 
     [1]=> 
     string(5) "Wilma" 
     [2]=> 
     string(5) "Betty" 
    } 
    ["price"]=> 
    array(3) { 
     [0]=> 
     string(1) "0" 
     [1]=> 
     string(1) "0" 
     [2]=> 
     string(1) "0" 
    } 
    ["company"]=> 
    array(3) { 
     [0]=> 
     string(23) "Jeff Marlatt Consulting" 
     [1]=> 
     string(23) "Jeff Marlatt Consulting" 
     [2]=> 
     string(23) "Jeff Marlatt Consulting" 
    } 
    ["ticket_type"]=> 
    array(3) { 
     [0]=> 
     string(6) "MEMBER" 
     [1]=> 
     string(6) "MEMBER" 
     [2]=> 
     string(6) "MEMBER" 
    } 
    } 
} 

ответ

0

Итак, во-первых, вы создали свой массив очень странным образом. Если все, что вы хотите сделать, это вывести всех разных гостей, было бы лучше создать новый элемент в вашем массиве для каждого гостя, таким образом вы могли бы сортировать их и легко итератировать их. Однако, как вы задали вопрос, я дам вам решение ...

Чтобы иметь возможность сортировать массив, нам нужно взять ваш массив и превратить его в массив, который я описал выше. Этот массив будет выглядеть примерно так ...

array(
    [0] => array(
     [last_name] => 'blah', 
     [first_name] => 'blah', 
     [company] => 'blah', 
     [ticket_type] => 'blah', 
     [price] => 'blah', 
    ), 
    [1] => array(
     [last_name] => 'blah', 
     [first_name] => 'blah', 
     [company] => 'blah', 
     [ticket_type] => 'blah', 
     [price] => 'blah', 
    ), 
    etc... 
); 

Затем вы можете использовать функцию PHP usort() отсортировать многомерный массив по значению из подрешеток. Вот мое решение ...

//This function is used by usort() to sort the guests array by last name 
//UPDATE: this function is now case insensitive and sorts on first name secondarily 
function sort_by_last_name($a, $b) { 

    //Convert values to lowercase to make sorting case insensitive 
    $a_firstname = strtolower($a['first_name']); 
    $a_lastname = strtolower($a['last_name']); 
    $b_firstname = strtolower($b['first_name']); 
    $b_lastname = strtolower($b['last_name']); 

    //If the last names are the same sort by first name 
    if($a_lastname == $b_lastname) { 
     return strcmp($a_firstname, $b_firstname); 
    } 

    return strcmp($a_lastname, $b_lastname); 

} 

//This function returns a nicely formatted array of 
//reservations sorted alphabetically by last name 
function sort_reservations($reservations) { 

    //If reservations is empty get outta there 
    if(!$reservations || !is_array($reservations)) { return false; } 

    //Create an empty array to store the formatted data 
    $guests = array(); 

    //Loop through reservations 
    foreach ($reservations as $res) { 

     //If the reservation is empty skip onto the next one 
     if(!$res['last_name']) { continue; } 

     //See how many people are in the reservation 
     $count = count($res['last_name']); 

     //iterate through reservation n number of times 
     for($i = 0; $i <= $count - 1; $i++) { 

      //Add reservations to the nsorted guests array 
      $guests[] = array(

       'last_name'  => $res['last_name'][$i], 
       'first_name' => $res['first_name'][$i], 
       'price'   => $res['price'][$i], 
       'company'  => $res['company'][$i], 
       'ticket_type' => $res['ticket_type'][$i] 

      ); 

     } 

    } 

    //sort gusts by last name alphabetically 
    usort($guests, 'sort_by_last_name'); 

    //Return our nicely formatted and sorted array 
    return $guests; 

} 

Теперь, например, ваш неформатированный массив оговорок хранится в переменной $reservations вы можете сортировать его с помощью ...

$guests = sort_reservations($reservations); 

Затем вы создаете таблицу в HTML и для каждой строки таблицы вы можете перебрать этот массив выводя новый гость в каждом ряду. как это ....

<?php $guests = sort_reservations($reservations); ?> 

<table> 

    <thead> 

     <tr> 

      <th class="firstname">First Name</th> 

      <th class="lastname">Last Name</th> 

      <th class="company">Company</th> 

      <th class="tickettype">Ticket Type</th> 

      <th class="price">Price</th> 

     </tr> 

    </thead> 

    <tbody> 

     <?php foreach($guests as $guest) { ?> 

      <tr> 

       <td class="firstname"><?php echo $guest['first_name']; ?></td> 

       <td class="lastname"><?php echo $guest['last_name']; ?></td> 

       <td class="company"><?php echo $guest['company']; ?></td> 

       <td class="tickettype"><?php echo $guest['ticket_type']; ?></td> 

       <td class="price">&pound;<?php echo round($guest['price'], 2); ?></td> 

      </tr> 

     <?php } ?> 

    </tbody> 

</table> 

И Боба твой дядя, у вас есть таблица гостей отсортированы в алфавитном порядке по фамилиям.

Надежда, что помогает

Dan

+0

Прежде чем я попробовал свое решение из, спасибо за очень щедрую работу. Кроме того, я был бы готов к построению массива более разумно или эффективно с самого начала, таким образом, чтобы сделать его проще. Я подозреваю, что знание того, как это сделать, было бы полезно для других, занимающихся такими задачами. Этот массив создается пользовательскими действиями с течением времени, заполняя форму, но если, скажем, добавление скрытого поля во время регистрации или другой подход к построению облегчит повторное вывод данных, я был бы рад рассмотреть это либо для этого проекта, либо для будущего. –

+0

Добро пожаловать. Ну, ответ заключается в том, чтобы хранить ваши данные в формате массива в первом блоке кода моего ответа. Поскольку я не знаю, как выглядит ваша форма, сложно сказать, какой механизм вы можете использовать, но проблема в том, что вы группируете резервирование в три, когда вы должны сохранять каждую резервную копию в качестве отдельного элемента в своем массиве. – danbahrami

+0

Я должен сказать, что ваш подход работает слишком элегантно, чтобы я чувствовал себя сильно мотивированным в том, чтобы переделать свою «органическую» конструкцию. Вот как ваше решение напечатано «из коробки»: [Первый вывод] (http://wordpress.ccaeyc-tx.org/wp-content/uploads/2015/02/first_output_of_danbahrami_solution.png) По-видимому, я хочу чтобы заменить сортировку без учета регистра, добавить вторичную сортировку первого имени или предварительно отсортировать и правильно обрабатывать номера, но в целом это огромный прогресс. Очень приятная работа. –

Смежные вопросы