如何在数组中移动关键密钥,使其位于另一个指定密钥之后?
例如,$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
)
答案 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
)
答案 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)
一般来说:
将当前数组拆分为两部分($larray, $rarray
) - 在您要插入密钥的位置之前和之后(例如使用foreach
)。
将新密钥添加到左侧末尾,例如$larray = $larray + array('key' => 'value')
添加右侧:`$ array = $ larray + $ rarray'
有时候不能为网络复制粘贴解决方案,但要理解它们是件好事。好有趣!