【问题标题】:How can I order an array in a specific order, which I define?如何按我定义的特定顺序订购数组?
【发布时间】:2015-09-01 14:27:40
【问题描述】:

我想按我定义的特定顺序对数组进行排序。

我已经开始构建一个函数来对这些数组进行排序,但我被卡住了,我不知道如何解决它。

我当前的代码:

public function order_spells($champions) {

    foreach(array_keys($champions) as $champion){

        if(isset($champions[$champion]['Passive']) || isset($champions[$champion]['Q']) || isset($champions[$champion]['W']) || isset($champions[$champion]['E']) || isset($champions[$champion]['R'])) {

            foreach(array_keys($champions[$champion]) as $Spell_Icon) {

                if($Spell_Icon!='General'){ 
                    //echo $Spell_Icon;
                }

            }

        }

    }

}

这是当前数组:

这是预期的输出:

由于我坚持使用上面的当前代码,我将尝试隔离并简化我的问题并将其展示给您。

作为一个简单的例子,我有一个这样的数组:

$champions = [
    "A" => 1,
    "C" => 2,
    "F" => 3,
    "B" => 4,
    "G" => 5,
    "D" => 6,
    "E" => 7,
];

现在我想定义该数组的顺序,例如第一个键F,然后D 等等...我怎样才能更改我上面的代码以使其按我的意愿工作?或者我如何在这里订购这个示例数组?

这里要提到的另一个转折是,订单可能比数组本身包含更多的元素。例如

Order: C,D,A,B
Array: A,B,C

【问题讨论】:

  • 很高兴您有权发布链接和图片。但请在您的问题中发布代码/输出。还向我们展示一些努力/尝试,以及您如何尝试解决问题。
  • 从哪里得到这个数组?你是如何创建它的?
  • 我已经添加了你们问的代码,通常当我这样做时,人们会指出代码中的小错误,让我找到解决实际问题的方法
  • 改变你的选择,从那里你有数组,所以只要改变你想要的列顺序。
  • @Higeath 尝试类似:$arr = array_pop($champion["Ashe"]); $champion["Ashe"] = ["E" => $arr] + $champion["Ashe"];

标签: php arrays multidimensional-array associative-array


【解决方案1】:

只需使用array_pop() 弹出数组的最后一个元素,然后将其再次放在数组的开头,例如

$arr = array_pop($champion["Ashe"]);
$champion["Ashe"] = ["E" => $arr] + $champion["Ashe"];

编辑:

从 cmets 开始,您希望按特定顺序对数组进行排序,但您不知道哪些元素确实在数组中,哪些不是。所以这应该适合你:

所以基本上首先你用一个数组定义你想要的顺序。然后你用另一个数组array_combine() 数组,用array_fill() 填充空值。

意味着你最终会得到这个数组,其中顺序是键,并且都有空数组作为值,例如

Array (
    [F] => Array ( )  
    [A] => Array ( )
    [B] => Array ( )
    [G] => Array ( )    
    [C] => Array ( )
    [E] => Array ( )
    [D] => Array ( )   
)

然后您可以将此数组与array_replace() 一起使用,以根据需要对数组进行排序。最后,您可以使用array_filter() 过滤掉空数组。

代码:

<?php

    $arr = [
        "A" => 1,
        "C" => 2,
        "F" => 3,
        "B" => 4,
        "G" => 5,
        "D" => 6,
        "E" => 7,
    ];


    $order = ["F", "A", "B", "G", "C", "E", "D"];
    $order = array_combine($order, array_fill(0, count($order), []));

    $arr = array_filter(array_replace($order, $arr)); 
    print_r($arr);

?>

输出:

Array
(
    [F] => 3
    [A] => 1
    [B] => 4
    [G] => 5
    [C] => 2
    [E] => 7
    [D] => 6
)

【讨论】:

  • @Rizer123 最后一件事是要定位这个数组而不是数组中的最后一个?因为可能还有更多,我正在使用代码来订购这个数组,所以如果我有例如E Q W i 可以将其重新排序为 Q W E
  • @Higeath 我认为这样的事情应该适合你:$champion["Ashe"] = array_replace(array_flip($order), $champion["Ashe"]);,其中$order 是键的顺序,例如$order = ["Q", "W", "E"];
  • @Rizer123 我在这个问题中添加了新的排序功能,所以我有多个被动 Q W E R 顺序不同的冠军所以我将数字分配给临时数组假设我们有 W Q R ,被动是 1 Q 2 W 3 E 4 R 5 所以数组将是 3 2 5 然后我使用排序函数所以它将更改为 2 3 5 然后我再次使用带有开关的 foreach 循环,如果它是 2 它将改变任何内容该字段中的原始数组到 Q 然后 E 然后 R
  • 我已经用你的方法尝试过这样的事情 public function order_spells($champions){ $order = array("Passive","Q","W","E","R" ); foreach(array_keys($champions) as $champion){ $champions[$champion]=array_replace(array_flip($order), $champions[$champion]); } 返回 $champions; } 这有点用,但它添加了该冠军不存在的法术,例如我们有 Q W 的冠军,它也会给它添加空的被动 E R
  • @Higeath 如果您不知道哪个会在数组中,哪个不会。只需在其周围添加另一个 array_filter() 呼叫即可将空的呼叫取出,例如$champions[$champion] = array_filter(array_replace(array_flip($order), $champions[$champion]));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2019-10-10
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多