【问题标题】:How to make array values consecutive but remain in the right order?如何使数组值连续但保持正确的顺序?
【发布时间】:2017-10-23 08:27:12
【问题描述】:

我有一个动态数组,例如,它可能如下所示:

$arr = array(42, 30, 70, 10);

我有一个名为 CreateOrder 的函数,我希望它返回这样的数组

function createOrder($array)
{

    /* 
    This function should return an array starting at 0,
    while keeping the correct order, like this:
    */

    $new_array = array(2, 1, 3, 0);

}

我一直在尝试使用 foreach 循环,但我无法理解它。

任何帮助表示赞赏,

内森

【问题讨论】:

  • 给定示例和输出背后的逻辑是什么
  • array_unshift($arr, 0) ?
  • 数组排序后是否需要返回元素的位置?
  • 所以你想改变订单但又要保持订单,这是没有意义的。您想以0 开头,但您的示例不以0 开头。
  • @DanFromGermany 对不起,如果我不够清楚,我的意思是连续的,以 0-x 的方式,没有丢失的数字。 (例如 3-5-4-1-0-2 而不是 42-30-70-28-12)所以基本上我想获得原始数组中数字位置的数组。马克贝克在我需要的时候回答了我的问题????

标签: php arrays dynamic


【解决方案1】:

如果您不介意原始数组在此过程中被丢弃的顺序:

asort($arr);
$new_array = array_combine(array_keys($arr), range(0,count($arr)-1));
ksort($new_array);

在函数内部还不错,因为它使用原始数组的副本,除非您通过引用传递,所以只有本地函数范围副本的顺序被丢弃

或者更简单:

asort($arr);
$new_array = array_keys($arr);
asort($new_array);
$newArr = array_keys($new_array);

【讨论】:

  • 太棒了!第一段代码有效!第二个返回其他东西!谢谢:-)
  • 是的,我的错......我在复制/粘贴第二行时错过了几行,现在编辑它们
  • 啊,秒数也可以。进行了性能测试,第二个测试速度提高了 +/- 0.4 倍。会选那个。谢谢
【解决方案2】:

也许 asort() 函数会满足您的需求: http://php.net/manual/de/function.asort.php

不要忘记通过引用传递你的数组,所以它必须按原样调用(没有赋值)。

【讨论】:

    【解决方案3】:
    • 克隆数组。
    • 按升序对克隆的数组进行排序。
    • 对于原始数组中的每个元素,在排序后的数组中搜索键,并将返回的位置插入新数组中。
    • 返回位置数组。

    以下代码会有所帮助

    function createOrder($array){
        $cloneArray = asort($array);
        $positionArray = []; 
    
        foreach($cloneArray as $element){
           $positionArray[] = array_search($element,$array);
        }  
    
        return $positionArray; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2019-10-06
      • 2021-12-16
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      相关资源
      最近更新 更多