简体   繁体   English

从多维PHP数组系统地排序和显示值

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

Below I've appended the $var_dump of an array that I've created through user-actions involving an HTML form. 在下面,我附加了通过涉及HTML表单的用户操作创建的数组的$ var_dump。

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). 我当然愿意考虑实现最终效果的其他策略(老实说,我不是很肯定通过WordPress函数不能更好地实现它,因为这是问题产生的环境),但是最简单答案将是采用下面描述的数组,摆脱“ NULL”响应,然后按姓氏将其余所有集按字母顺序排列(我最初把它放在第一位,因为在同一任务的更早版本,相似版本中,它恰巧最后排序一下)。

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 (#)Amy Abrams,Carolco .........会员$ 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. 对我来说,完成此操作的自然方法是生成一个HTML表,其中通过PHP输出通过某种索引定位的每个变量。 I've had some versions that ALMOST worked, involving foreach loops at the very limits of my understanding of array manipulation. 我有一些版本可以使用ALMOST,在我对数组操作的理解的极限范围内涉及到foreach循环。

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. 我怀疑可以回答我问题的人可以写我在他或她的睡眠中尝试过的方法,但是,只是为了给出一种味道而无需转储更多代码...在一个名为$的变量中获取了以下数组meta,我可以遍历它foreach ($meta as $reservation) ,然后使用$reservation['first_name'][0]打印一些变量,但不是全部,也不是全部按正确顺序排列。 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. 我尝试将$ i替换为[0],并鬼混其他键/值/迭代器组合,但此时,我只是在遍历自己的内部ca数组。 999 wrong vs 1 right solutions. 999个错误与1个正确的解决方案。

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

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. 然后,您可以使用PHP函数usort()通过子数组的值对多维数组进行排序。 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... 现在,例如,您未格式化的保留数组存储在变量$reservations您可以使用...对其进行排序。

$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. 然后,您可以使用html构建表格,对于表格的每一行,您都可以遍历该数组,为每一行打印出一个新的访客。 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM