【问题标题】:PHP: Move associative array element to beginning of arrayPHP:将关联数组元素移动到数组的开头
【发布时间】:2012-06-30 17:52:22
【问题描述】:

将关联数组的任何元素移动到数组开头的最佳方法是什么?

例如,假设我有以下数组:

$myArray = array(
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one'   => 'Blah Blah Blah 1',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

我想要做的是将“一个”元素移动到开头并以以下数组结束:

$myArray = array(
    'one'   => 'Blah Blah Blah 1',
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

【问题讨论】:

    标签: php


    【解决方案1】:

    您可以使用数组联合运算符 (+) 将原始数组连接到使用已知键 (one) 的新关联数组。

    $myArray = array('one' => $myArray['one']) + $myArray;
    // or      ['one' => $myArray['one']] + $myArray;
    

    数组键是唯一的,所以它不可能同时存在于两个位置。

    请参阅文档on Array Operators:

    + 运算符返回附加到左侧数组的右侧数组;对于两个数组中都存在的键,将使用左侧数组中的元素,而忽略右侧数组中的匹配元素。

    【讨论】:

    • @andrewtweber 不,我没有,但我做了一些测试,发现与 Emil 的方法相比,它快了 3 倍,占用的内存减少了一半。我还发现它比将相同元素移动到数组末尾要多 20% 的时间。
    【解决方案2】:

    如果您有数字数组键并想重新索引数组键,最好将其放入array_merge,如下所示:

    $myArray = array_merge(array($key => $value) + $myArray );
    

    【讨论】:

      【解决方案3】:

      有点晚了,但如果有人需要,我创建了这个小 sn-p。

      function arr_push_pos($key, $value, $pos, $arr) 
      {
          $new_arr = array();
          $i = 1;
      
          foreach ($arr as $arr_key => $arr_value) 
          {
              if($i == $pos) 
                  $new_arr[$key] = $value;
      
              $new_arr[$arr_key] = $arr_value;
      
              ++$i;
          }
      
          return $new_arr;
      }
      

      只需调整它以适应您的需要,或使用它并取消设置要移动的索引。也适用于关联数组。

      【讨论】:

      • 修正:$new_arr[$arr_key] = $arr_value;应该是: if ($arr_key != $key) $new_arr[$arr_key] = $arr_value;但除此之外:非常好! 1up。
      【解决方案4】:

      这是另一个使用 array_splice() 完成此任务的简单单行代码:

      $myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
      

      【讨论】:

        【解决方案5】:

        如果你有 2 个数组, 第一个元素移动到第二个元素数组的顶部,您可以使用

        $result = \array_replace($ArrayToMoveToTop, $myArray);
        

        这是一个代码示例:

        //source array    
        $myArray = [
            'two' => 'Blah Blah Blah 2',
            'three' => 'Blah Blah Blah 3',
            'one' => 'Blah Blah Blah 1',
            'four' => 'Blah Blah Blah 4',
            'five' => 'Blah Blah Blah 5',
        ];
        // set necessary order
        $orderArray = [
            'one' => '',
            'two' => '',
        ];
        //apply it
        $result = \array_replace($orderArray, $myArray);
        \print_r($result);
        

        【讨论】:

          【解决方案6】:

          array_unshift 的 PHP 手册的 cmets 中有一个函数,可用于在数组的开头添加一个带有键的元素:

          function array_unshift_assoc(&$arr, $key, $val)
          {
              $arr = array_reverse($arr, true);
              $arr[$key] = $val;
              return array_reverse($arr, true);
          }
          

          使用上述函数取消设置元素并重新插入:

          $tmp = $myArray['one'];
          unset($myArray['one']);
          $myArray = array_unshift_assoc($myArray, 'one', $tmp);
          

          更通用的方法可能是使用uksort 按键对数组进行排序并提供您自己的排序功能。

          【讨论】:

          • 嗨 - 感谢您的回答,尽管我不想以任何方式对数组进行排序。我希望能够知道一个元素键并仅将该特定元素移动到数组的开头
          • 我认为“=”是语法错误:return = array_reverse($arr, true);
          • 另外,当我运行你的代码时,我得到一个只有一个元素的数组...... :-(
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          • 2021-11-27
          • 1970-01-01
          相关资源
          最近更新 更多