繁体   English   中英

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

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

在下面,我附加了通过涉及HTML表单的用户操作创建的数组的$ var_dump。

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

输出将在事件发生时显示在登录列表上,第一列编号,第二列显示名字-姓氏在其下的公司,签名行,描述“机票类型”的行以及机票价格。

因此,为了使其易于描绘:

第一张/最后一张/公司签名票类型价格

(#)Amy Abrams,Carolco .........会员$ 5

对我来说,完成此操作的自然方法是生成一个HTML表,其中通过PHP输出通过某种索引定位的每个变量。 我有一些版本可以使用ALMOST,在我对数组操作的理解的极限范围内涉及到foreach循环。

我怀疑可以回答我问题的人可以写我在他或她的睡眠中尝试过的方法,但是,只是为了给出一种味道而无需转储更多代码...在一个名为$的变量中获取了以下数组meta,我可以遍历它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"
    }
  }
}

因此,首先,您以一种非常奇怪的方式构建了阵列。 如果您要做的只是输出所有不同的来宾,则最好在数组中为每个来宾创建一个新元素,这样您就可以对它们进行排序并轻松地对其进行迭代。 但是,正如您所提出的问题,我将为您提供解决方案...

为了能够对您的数组进行排序,我们需要将您的数组转换为我上面描述的数组。 这个数组看起来像这样...

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>

鲍勃是你的叔叔,你有一张客人的桌子,按姓氏的字母顺序排列。

希望能有所帮助

暂无
暂无

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

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