在数组中移动关联数组键

时间:2014-01-24 15:02:42

标签: php arrays

如何在数组中移动关键密钥,使其位于另一个指定密钥之后?

例如,$columns的当前输出如下 -

$columns = Array(
    [title] => Title
    [author] => Author
    [taxonomy-news_type] => News Types
    [date] => Date
    [wpseo-score] => SEO
    [p2p-from-news_to_people] => Staff linked to this Story
    [show_item_ids] => ID
)

一种情况是我想将密钥p2p-from-news_to_people直接移到after taxonomy-news_type,产生此输出 -

$columns = Array(
    [title] => Title
    [author] => Author
    [taxonomy-news_type] => News Types
    [p2p-from-news_to_people] => Staff linked to this Story
    [date] => Date
    [wpseo-score] => SEO
    [show_item_ids] => ID
)

6 个答案:

答案 0 :(得分:3)

您可以构建自定义函数以在特定键后插入新项目:

function array_insert_after($array, $findAfter, $key, $new)
{
    $pos = (int) array_search($findAfter, array_keys($array)) + 1;
    return array_merge(
        array_slice($array, 0, $pos),
        array($key => $new),
        array_slice($array, $pos)
    );
}

用法:

$elem = $arr['p2p-from-news_to_people'];  // store the value
unset($arr['p2p-from-news_to_people']);   // unset the var

$arr = array_insert_after(
    $arr,                      /* original array */
    'taxonomy-news_type',      /* item after which the elem should be inserted */
    'p2p-from-news_to_people', /* key of the elem */
    $elem                      /* the value of the elem */
);

print_r($arr);

输出:

Array
(
    [title] => Title
    [author] => Author
    [taxonomy-news_type] => News Types
    [p2p-from-news_to_people] => Staff linked to this Story
    [date] => Date
    [wpseo-score] => SEO
    [show_item_ids] => ID
)

Demo

答案 1 :(得分:1)

要在一个元素之前或之后放置一个元素,我使用这两个函数

/**
 * @return array
 * @param array $src
 * @param array $in
 * @param int|string $pos
*/
function array_push_before($src,$in,$pos){
    if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos), $in, array_slice($src,$pos));
    else{
        foreach($src as $k=>$v){
            if($k==$pos)$R=array_merge($R,$in);
            $R[$k]=$v;
        }
    }return $R;
}

/**
 * @return array
 * @param array $src
 * @param array $in
 * @param int|string $pos
*/
function array_push_after($src,$in,$pos){
    if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos+1), $in, array_slice($src,$pos+1));
    else{
        foreach($src as $k=>$v){
            $R[$k]=$v;
            if($k==$pos)$R=array_merge($R,$in);
        }
    }return $R;
}

也许你可以把[p2p-from-news_to_people]的内容放在一个变量中然后删除它。然后使用上面的一个函数重新定位它。

$foo = array('p2p-from-news_to_people' => $columns['p2p-from-news_to_people']);
unset($columns['p2p-from-news_to_people']);
array_push_after($columns, $foo, 'taxonomy-news_type');

编辑:

此链接还有其他类似问题的解决方案Change index order in array

答案 2 :(得分:1)

Nette框架的片段(第二种方法)

   /**
    * Searches the array for a given key and returns the offset if successful.
    * @return int    offset if it is found, FALSE otherwise
    */
   public static function searchKey($arr, $key)
   {
      $foo = array($key => NULL);
      return array_search(key($foo), array_keys($arr), TRUE);
   }


   /**
    * Inserts new array before item specified by key.
    * @return void
    */
   public static function insertBefore(array & $arr, $key, array $inserted)
   {
      $offset = self::searchKey($arr, $key);
      $arr = array_slice($arr, 0, $offset, TRUE) + $inserted + array_slice($arr, $offset, count($arr), TRUE);
   }

答案 3 :(得分:1)

这应该做你需要的:

// The columns
$columns = array(

  'title'                   => 'Title',
  'author'                  => 'Author',
  'taxonomy-news_type'      => 'News Types',
  'date'                    => 'Date',
  'wpseo-score'             => 'SEO',
  'p2p-from-news_to_people' => 'Staff linked to this Story',
  'show_item_ids'           => 'ID',

);

/**
 * Move array element before another
 *
 * @param array $array
 * @param string $move
 * @param string $before
 * @return array
 */
function array_move_before(array $array, $move, $before)
{

  // Get the element to move
  $move = array_splice(

    $array,
    array_search($move, array_keys($array)),
    1

  );

  // Get the element to move before
  $offset = array_search($before, array_keys($array));

  // Return the new array
  return array_merge(

    array_slice($array, 0, $offset),
    $move,
    array_slice($array, $offset, NULL)

  );

}

// Get the new array
$result = array_move_before($columns, 'p2p-from-news_to_people', 'date');

// Output the array
print_r($result);

这给出了:

Array
(
    [title] => Title
    [author] => Author
    [taxonomy-news_type] => News Types
    [p2p-from-news_to_people] => Staff linked to this Story
    [date] => Date
    [wpseo-score] => SEO
    [show_item_ids] => ID
)

答案 4 :(得分:-1)

您可以使用array_splice外观here或使用自定义sort function来执行此操作。

答案 5 :(得分:-1)

一般来说:

  1. 将当前数组拆分为两部分($larray, $rarray) - 在您要插入密钥的位置之前和之后(例如使用foreach)。

  2. 将新密钥添加到左侧末尾,例如$larray = $larray + array('key' => 'value')

  3. 添加右侧:`$ array = $ larray + $ rarray'

  4. 有时候不能为网络复制粘贴解决方案,但要理解它们是件好事。好有趣!