代码之家  ›  专栏  ›  技术社区  ›  Gianluca Ghettini

尝试在PHP中对关联数组排序

  •  0
  • Gianluca Ghettini  · 技术社区  · 7 年前

    我尝试用PHP对这个关联数组排序,按字段排序 name

    $fonts = array(
        0 => ["index" => 0, "name" => "Arial", "path" => "assets/fonts/arial.ttf"],
        1 => ["index" => 1, "name" => "Times", "path" => "assets/fonts/times.ttf"],
        2 => ["index" => 2, "name" => "Roboto", "path" => "assets/fonts/roboto.ttf"],
        3 => ["index" => 3, "name" => "AlexBrush", "path" => "assets/fonts/AlexBrush-Regular.ttf"],
    );
    

     $fonts = array(
        3 => ["index" => 3, "name" => "AlexBrush", "path" => "assets/fonts/AlexBrush-Regular.ttf"],
        0 => ["index" => 0, "name" => "Arial", "path" => "assets/fonts/arial.ttf"],
        2 => ["index" => 2, "name" => "Roboto", "path" => "assets/fonts/roboto.ttf"],
        1 => ["index" => 1, "name" => "Times", "path" => "assets/fonts/times.ttf"],
    );
    

    下面是暴露问题的最基本代码(PHPVer+7):

    function cmp($a, $b)
    {
        return strcmp($a["name"], $b["name"]);
    }
    
    $fonts = array(
        0 => ["index" => 0, "name" => "Arial", "path" => "assets/fonts/arial.ttf"],
        1 => ["index" => 1, "name" => "Times", "path" => "assets/fonts/times.ttf"],
        2 => ["index" => 2, "name" => "Roboto", "path" => "assets/fonts/roboto.ttf"],
        3 => ["index" => 3, "name" => "AlexBrush", "path" => "assets/fonts/AlexBrush-Regular.ttf"],
    );
    
    uasort($fonts, "cmp");
    
    for($i = 0; $i < 4; $i++)
    {
        echo "<br/>".$fonts[$i]["name"];
    }
    

    我在用 uasort() 因为它应该在排序数组时保持键的关联。不幸的是,如果我打印数组,我会得到相同的顺序,即:

    Arial
    Times
    Roboto
    AlexBrush
    
    4 回复  |  直到 7 年前
        1
  •  2
  •   A l w a y s S u n n y    7 年前

    sort 通过 名称 像这样循环使用 foreach()

    <?php
    
    $fonts = array(
        0 => ["index" => 0, "name" => "Arial", "path" => "assets/fonts/arial.ttf"],
        1 => ["index" => 1, "name" => "Times", "path" => "assets/fonts/times.ttf"],
        2 => ["index" => 2, "name" => "Roboto", "path" => "assets/fonts/roboto.ttf"],
        3 => ["index" => 3, "name" => "AlexBrush", "path" => "assets/fonts/AlexBrush-Regular.ttf"],
    );
    
    uasort($fonts, function($a, $b) {
        return strcmp($a['name'], $b['name']);
    });
    
    print_r($fonts);
    
    foreach($fonts as $font){
     echo $font["name"].PHP_EOL;
    }
    
    ?>
    

    编辑:

     $indexed_array = array_column($fonts,'name','index'); // array column map name by index
     print_r($indexed_array); 
     echo $indexed_array[3];
    

    演示: https://3v4l.org/W7BOH

        2
  •  1
  •   Nigel Ren    7 年前

    当你使用。。。

    for($i = 0; $i < 4; $i++)
    {
        echo "<br/>".$fonts[$i]["name"];
    }
    

    要打印出这些值,可以按数字顺序使用索引来显示它们。

    如果你用。。。

    print_r($fonts);
    

    你会看到他们已经被分类并得到。。。

    Array
    (
        [3] => Array
            (
                [index] => 3
                [name] => AlexBrush
                [path] => assets/fonts/AlexBrush-Regular.ttf
            )
    
        [0] => Array
            (
                [index] => 0
                [name] => Arial
                [path] => assets/fonts/arial.ttf
            )
    
        [2] => Array
            (
                [index] => 2
                [name] => Roboto
                [path] => assets/fonts/roboto.ttf
            )
    
        [1] => Array
            (
                [index] => 1
                [name] => Times
                [path] => assets/fonts/times.ttf
            )
    
    )
    

    或者像我一样。法罗斯在评论中指出,如果你用。。。

    foreach ( $fonts as $font ) {
        echo "<br/>".$font["name"];
    }
    

    <br/>AlexBrush<br/>Arial<br/>Roboto<br/>Times
    
        3
  •  1
  •   Andreas    7 年前

    可以使用array\u列使数组关联,然后使用ksort(键排序)进行排序。

    $fonts = array_column($fonts, null, "name");
    ksort($fonts);
    $fonts = array_values($fonts);
    var_dump($fonts);
    

    array(4) {
      [0]=>
      array(3) {
        ["index"]=>
        int(3)
        ["name"]=>
        string(9) "AlexBrush"
        ["path"]=>
        string(34) "assets/fonts/AlexBrush-Regular.ttf"
      }
      [1]=>
      array(3) {
        ["index"]=>
        int(0)
        ["name"]=>
        string(5) "Arial"
        ["path"]=>
        string(22) "assets/fonts/arial.ttf"
      }
      [2]=>
      array(3) {
        ["index"]=>
        int(2)
        ["name"]=>
        string(6) "Roboto"
        ["path"]=>
        string(23) "assets/fonts/roboto.ttf"
      }
      [3]=>
      array(3) {
        ["index"]=>
        int(1)
        ["name"]=>
        string(5) "Times"
        ["path"]=>
        string(22) "assets/fonts/times.ttf"
      }
    }
    

    这意味着您可以像在问题中所做的那样迭代数组。

    https://3v4l.org/pJXfp


    我看到你问如何得到索引3的名字。

    在这种情况下,再次使用array\u column使其与索引关联。

    https://3v4l.org/nCtJf

    $fonts = array_column($fonts, null, "name");
    ksort($fonts);
    $fonts = array_column($fonts, null, "index");
    
    echo $fonts[3]["name"]; //AlexBrush
    
        4
  •  0
  •   mickmackusa Tom Green    7 年前

    如果你想继续使用 for() ,实际上需要重新索引第一级键——这没什么大不了的,因为在 index 元素。

    1. array_multisort(array_column($fonts, 'name'), $fonts);
    2. usort($fonts, function($a, $b){return $a['name'] <=> $b['name'];});

    Demo