Sorting and displaying values systematically from a multi-dimensional PHP array

CK MacLeod

Below I've appended the $var_dump of an array that I've created through user-actions involving an HTML form.

I'm certainly willing to consider other strategies for achieving the final effect (and I'm not, to be honest, positive that it would not be better achieved via WordPress functions, since that's the environment this problem originates in), but the simplest answer would be to take the array described below, get rid of the "NULL" responses, then alphabetize ALL of the remaining sets by last name (which I originally put first since in an earlier, similar version of the same task it happened to make the final sort a snap).

The output will appear on a sign-in list at an event, with first column numbered, second column showing first name - last name with company underneath, a signature line, a line describing the "ticket type," and the ticket price.

SO, just to make it easy to picture:

No. FIRST/LAST/company SIGNATURE TICKET TYPE PRICE

(#) Amy Abrams, Carolco ......... Member $5

The natural way to do it, for me, was to produce an HTML table in which each variable, located by some kind of index, is output via PHP. I've had some versions that ALMOST worked, involving foreach loops at the very limits of my understanding of array manipulation.

I suspect that the person who can answer my question could write what I've tried in his or her sleep, but, just to give a flavor without dumping in a bunch more code... having gotten the below array in a variable called $meta, I could foreach through it foreach ($meta as $reservation), then print some of the variables, but not all of them, and not all in right order, with $reservation['first_name'][0], for example. I tried dropping an $i in place of the [0], and fooling around with other key/value/iterator combinations, but at this point I'm just iterating through my own internal array of ca. 999 wrong vs 1 right solutions.

I know this is a common type of question, but in poring through the threads here, I have yet to find a version like this one directly answered.

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"
    }
  }
}
danbahrami

So firstly you have built your array in a very strange way. If all you want to do is output all the different guests it would be better to create a new element in your array for each guest, that way you could sort them and iterate them with ease. However as you have asked the question I will give you a solution...

To be able to sort your array we need to take your array and turn it into the array I described above. This array will look something like this...

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...
);

Then you can use the PHP function usort() to sort your multidimensional array by the value of the subarrays. Here's my solution...

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

}

Now for example your unformatted array of reservations is stored in a variable $reservations you can sort it by using...

$guests = sort_reservations( $reservations );

Then you build your table in html and for each table row you can iterate over this array printing out a new guest to every row. like this....

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

And bob's your uncle, you've got a table of guests sorted alphabetically by their surnames.

Hope that helps

Dan

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

php filter array values and remove duplicates from multi dimensional array

From Dev

extract values from multi dimensional array in php (mandrill)

From Dev

Comparing values in PHP multi-dimensional array

From Dev

Comparing values in PHP multi-dimensional array

From Dev

PHP access values in multi dimensional array

From Dev

Displaying multi dimensional array with ReactJS

From Dev

Ruby delete values from multi dimensional array

From Dev

Get values from multi dimensional array

From Dev

Fetch values from multi dimensional array

From Dev

Ruby delete values from multi dimensional array

From Dev

PHP: Sorting MySQL result to multi-dimensional array

From Dev

PHP remove value from multi dimensional array

From Dev

PHP Multi dimensional array from database

From Dev

How to remove duplicate values from a multi-dimensional array in PHP revisited

From Dev

Once more about removing duplicate values from a multi-dimensional array in PHP

From Dev

Add default values in multi-dimensional PHP array

From Dev

How to search a multi-dimensional array by multiple values at once in PHP?

From Dev

PHP Insert multi-dimensional array values in csv

From Dev

sorting of a multy dimensional array php

From Dev

sorting of a multy dimensional array php

From Dev

Adding values of multi dimensional array

From Dev

PHP merge multi-dimensional array keys from normal array

From Dev

php array build multi-dimensional from array

From Dev

PHP merge multi-dimensional array keys from normal array

From Dev

Extract complete array from std class multi dimensional array php

From Dev

Sorting a multidimensional array, and displaying the values from highest to lowerest

From Dev

Sorting multi dimensional array by 2 columns - JavaScript

From Dev

Sorting grouped multi-dimensional array by value

From Dev

Sorting A Multi Dimensional Array (Understanding Usort and MultiSort)

Related Related

  1. 1

    php filter array values and remove duplicates from multi dimensional array

  2. 2

    extract values from multi dimensional array in php (mandrill)

  3. 3

    Comparing values in PHP multi-dimensional array

  4. 4

    Comparing values in PHP multi-dimensional array

  5. 5

    PHP access values in multi dimensional array

  6. 6

    Displaying multi dimensional array with ReactJS

  7. 7

    Ruby delete values from multi dimensional array

  8. 8

    Get values from multi dimensional array

  9. 9

    Fetch values from multi dimensional array

  10. 10

    Ruby delete values from multi dimensional array

  11. 11

    PHP: Sorting MySQL result to multi-dimensional array

  12. 12

    PHP remove value from multi dimensional array

  13. 13

    PHP Multi dimensional array from database

  14. 14

    How to remove duplicate values from a multi-dimensional array in PHP revisited

  15. 15

    Once more about removing duplicate values from a multi-dimensional array in PHP

  16. 16

    Add default values in multi-dimensional PHP array

  17. 17

    How to search a multi-dimensional array by multiple values at once in PHP?

  18. 18

    PHP Insert multi-dimensional array values in csv

  19. 19

    sorting of a multy dimensional array php

  20. 20

    sorting of a multy dimensional array php

  21. 21

    Adding values of multi dimensional array

  22. 22

    PHP merge multi-dimensional array keys from normal array

  23. 23

    php array build multi-dimensional from array

  24. 24

    PHP merge multi-dimensional array keys from normal array

  25. 25

    Extract complete array from std class multi dimensional array php

  26. 26

    Sorting a multidimensional array, and displaying the values from highest to lowerest

  27. 27

    Sorting multi dimensional array by 2 columns - JavaScript

  28. 28

    Sorting grouped multi-dimensional array by value

  29. 29

    Sorting A Multi Dimensional Array (Understanding Usort and MultiSort)

HotTag

Archive