在不保留第一级键

问题描述 投票:0回答:4
我想做的是按名称对条目进行排序,但要保持与条目本身关联的键,所以我想要的是:

$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"],
);
the是暴露问题的裸露最小代码(PHP VER +7):

 $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"],
);

我使用

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()

	

do

Arial
Times
Roboto
AlexBrush

sort
php arrays sorting multidimensional-array associative-array
4个回答
2
投票
喜欢这种方式,并使用

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

?>


Edit:

基于OP的评论,
 $indexed_array = array_column($fonts,'name','index'); // array column map name by index
 print_r($indexed_array); 
 echo $indexed_array[3];

demo:

https://3v4l.org/w7boh

    

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


1
投票
如果您使用...

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

或L. Faros在评论中指出的那样,如果您使用的话...
foreach ( $fonts as $font ) {
    echo "<br/>".$font["name"];
}

你会得到
<br/>AlexBrush<br/>Arial<br/>Roboto<br/>Times

您可以使用array_column进行数组关联,然后与ksort(键sort)进行排序。
$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"
  }
}

1
投票

https://3v4l.org/pjxfp


我看到您要求如何获得索引3名称。

在这种情况下,再次使用array_column将其在索引上进行关联。 https://3v4l.org/nctjf

$fonts = array_column($fonts, null, "name"); ksort($fonts); $fonts = array_column($fonts, null, "index"); echo $fonts[3]["name"]; //AlexBrush

如果您要继续使用

for()

,则实际上需要重新索引第一级键 - 这没什么大不了的,因为您仍然保存在

index

元素中的原始数字ID。 与该逻辑保持一致,我可以推荐两个不同的单线。

array_multisort(array_column($fonts, 'name'), $fonts);


0
投票
usort($fonts, function($a, $b){return $a['name'] <=> $b['name'];});



demo

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.