Систематическая сортировка и отображение значений из многомерного массива PHP

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

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

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

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

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

(#) Эми Абрамс, Каролко ……… Участник $ 5

Для меня естественным способом было создать таблицу HTML, в которой каждая переменная, расположенная по какому-либо индексу, выводится через PHP. У меня было несколько версий, которые работали ПОЧТИ, включая циклы foreach в самых пределах моего понимания манипулирования массивами.

Я подозреваю, что человек, который может ответить на мой вопрос, мог бы написать то, что я пробовал во сне, но, просто для того, чтобы придать изюминку, не сбрасывая кучу больше кода … получив массив ниже в переменной с именем $ Мета, я мог бы пройти через это foreach ($meta as $reservation), затем выведите некоторые переменные, но не все, и не все в правильном порядке, с $reservation['first_name'][0], например. Я пытался сбросить $ i вместо [0] и дурачиться с другими комбинациями ключ / значение / итератор, но на данный момент я просто перебираю свой собственный внутренний массив ca. 999 неправильных против 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"}
}
}

1

Решение

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

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

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>

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

надеюсь, это поможет

Дэн

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]