【问题标题】:print a header and sort by an array value打印标题并按数组值排序
【发布时间】:2016-08-15 19:32:30
【问题描述】:

我有一个包含可能值的数组:

$auto_types = array(CHEVY, FORD, DODGE);

我有包含这些值的数组:

$my_cars = array(
  array("make" => "FORD", model => "Thunderbird", "year" => 1983),
  array("make" => "FORD", model => "Mustang", "year" => 1971),
  array("make" => "CHEVY", model => "Impala", "year" => 1995),
  array("make" => "DODGE", model => "Charger", "year" => 2015),
  array("make" => "CHEVY", model => "Corvette", "year" => 2011),
  array("make" => "CHEVY", model => "Camaro", "year" => 2012)
)

我想返回一个列表,该列表提供每个品牌的标题,然后按品牌对每辆车进行排序。所以输出将是:

雪佛兰:
1995 黑斑羚
2012 克尔维特
2011款科迈罗

道奇:
2015款充电器

福特:
1971 年野马
1983 雷鸟

我知道我可以运行 foreach() 循环并按品牌排序,但这里的关键是我想要每个品牌的标题,而不是为每辆车列出它。这样做的好方法? -- 不确定是否需要第一个数组,但当时创建它似乎是个好主意。

【问题讨论】:

标签: php arrays sorting grouping


【解决方案1】:

首先,您需要通过 make 对数组进行排序。您可以在array_multisort() 的帮助下做到这一点。

当您遍历数组以获取列表输出时,您可以保留一个变量来存储前一辆车的品牌。然后,每当有新品牌时,只需在汽车进入前打印一个标题。

$ex_make = '';

foreach($my_cars as $car) {
    ...
    if ($car['make'] != $ex_make) {
        print_header($car['make']);
    }
    ...
    $ex_make = $car['make'];
}

您可以通过 make 将汽车分组到一个多维数组中来让您的生活更轻松。它将使您免于排序过程(以及其他答案中建议的分组循环)。如果你有更多的汽车进来,你会想要考虑使用数据库来代替。

【讨论】:

  • 简单有效。非常感谢,谢谢!
  • 欢迎。我对错过“想要打印该标题”这一点的详尽答案感到很幽默。如果您想按制造对汽车阵列进行分组,无论是使用其中一个循环,还是通过修改源数据(这对我来说更有意义),那么显然您可以在每个主循环的开头打印您的标题(迭代数组的make-level)。但简单就是好的。 ;)
  • 是的,源数据实际上来自 CMS,这将使编辑源代码有问题,所以我只想做一个简单的例子来正确说明我的问题。
  • 如果它来自数据库,为什么不先 ORDER by make 并免去 PHP 的麻烦。如果您将它们分组为$my_cars['FORD'][] = ["model" => "Thunderbird", "year" => 1983]; 等,您可以简单地foreach($my_cars as $make=>$cars) { echo $make."<br>"; array_walk($cars, function($car) { echo "{$car['year']} {$car['model']}<br>"; }); }(未经测试)
  • 两个词,Drupal Views :) ... 还是会玩这个,看看我能不能想出更好的东西。但我非常感谢您的帮助!
【解决方案2】:

您不需要第一个数组。您可以使用一个循环按品牌对汽车进行分组:

foreach ($my_cars as $car) {
    $makes[$car['make']][] = $car;
}

如果您希望品牌按字母顺序显示,那么您可以ksort($makes)

然后遍历品牌并打印每个品牌的汽车。

foreach ($makes as $make => $cars) {
    echo "$make: ";                       // Header prints once
    foreach ($cars as $car) {
        echo "$car[model] $car[year] ";   // Multiple cars print after each header
    }
    echo '<br>';
}

【讨论】:

    【解决方案3】:
    <?php
    
    $my_cars = array(
      array("make" => "FORD", "model" => "Thunderbird", "year" => 1983),
      array("make" => "FORD", "model" => "Mustang", "year" => 1971),
      array("make" => "CHEVY", "model" => "Impala", "year" => 1995),
      array("make" => "DODGE", "model" => "Charger", "year" => 2015),
      array("make" => "CHEVY", "model" => "Corvette", "year" => 2011),
      array("make" => "CHEVY", "model" => "Camaro", "year" => 2012)
    );
    
    // defining empty arrays for each models
    $ford = [];
    $chevy = [];
    $dodge = [];
    
    // loop through every car and push to the right array model
    foreach($my_cars as $array) {
      if($array['make'] == "FORD") {
        array_push($ford, $array);
      } elseif($array['make'] == "CHEVY") {
        array_push($chevy, $array);
      } else {
        array_push($dodge, $array);
      }
    }
    
    // echo the result by looping inside each array model
    foreach($dodge as $car) {
      echo $car['year'] . ':' . $car['model'] . '<br />';
    }
    
    echo '<br />';
    
    foreach($ford as $car) {
      echo $car['year'] . ':' . $car['model'] . '<br />';
    }
    
    echo '<br />';
    
    foreach($chevy as $car) {
      echo $car['year'] . ':' . $car['model'] . '<br />';
    }
    

    【讨论】:

      【解决方案4】:

      嵌套循环在这里是理想的。

          <?php
              $auto_types = array("CHEVY", "FORD", "DODGE");
              $my_cars    = array(
                  array("make" => "FORD",  "model" => "Thunderbird",  "year" => 1983),
                  array("make" => "FORD",  "model" => "Mustang",      "year" => 1971),
                  array("make" => "CHEVY", "model" => "Impala",       "year" => 1995),
                  array("make" => "DODGE", "model" => "Charger",      "year" => 2015),
                  array("make" => "CHEVY", "model" => "Corvette",     "year" => 2011),
                  array("make" => "CHEVY", "model" => "Camaro",       "year" => 2012)
              );
      
              $arr = [];
              foreach($my_cars as $my_car){
                  foreach($auto_types as $auto_type){
                      if($make = array_search($auto_type, $my_car)){
                          $desc   = $my_car['make'] . " " . $my_car['year'] . " " . $my_car['model'];
                          if(!array_key_exists($auto_type, $arr)){
                              $arr[$auto_type] = $desc;
                          }else{
                              $arr[$auto_type] = $arr[$auto_type] .  "    " . $my_car['year'] . " " . $my_car['model'] . "";
                          }
                      }
                  }
              }
              ksort($arr);
      
              var_dump ($arr);
              // PRODUCES::           
              array (size=3)
                'CHEVY' => string 'CHEVY 1995 Impala    2011 Corvette    2012 Camaro' (length=49)
                'DODGE' => string 'DODGE 2015 Charger' (length=18)
                'FORD' => string 'FORD 1983 Thunderbird    1971 Mustang' (length=37)
      
              $output = implode("<br />", $arr);
              echo $output;
      
              // PRODUCES::
              CHEVY 1995 Impala 2011 Corvette 2012 Camaro
              DODGE 2015 Charger
              FORD 1983 Thunderbird 1971 Mustang
      

      有效代码

          <?php
              $arr = [];
              foreach($my_cars as $my_car){
                  foreach($auto_types as $auto_type){
                      if($make = array_search($auto_type, $my_car)){
                          $desc   = $my_car['make'] . " " . $my_car['year'] . " " . $my_car['model'];
                          if(!array_key_exists($auto_type, $arr)){
                              $arr[$auto_type] = $desc;
                          }else{
                              $arr[$auto_type] = $arr[$auto_type] .  "    " . $my_car['year'] . " " . $my_car['model'] . "";
                          }
                      }
                  }
              }
              ksort($arr);
              $output = implode("<br />", $arr);  //<== GET STRING VALUE...
              echo $output;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-09
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多