在关联阵列的上下文中,按键在另一个元素之前按键move元素。

问题描述 投票:0回答:6
在PHP中,我想通过将元素移至数组中的某些位置来重新排序关联数组。 没有必要的一种,只是对我的选择的重新订购。

例如一个例子,说我有一个关联阵列,如下所示:

array( 'a' => 'Element A', 'b' => 'Element B', 'c' => 'Element C', );

在一种情况下,我可能想在B前移动C,并产生以下结果:

array( 'a' => 'Element A', 'c' => 'Element C', 'b' => 'Element B', );

或在另一种情况下,我可能想在A之前移动C,并具有以下结果:

array( 'c' => 'Element C', 'a' => 'Element A', 'b' => 'Element B', );

我想显示的只是一种说“嘿,我想在其他数组元素之前移动此数组元素”或“嘿,id喜欢移动此数组元素以确保它在此其他此类元素之后数组元素'
    

$arr = array( 'a' => 1, 'b' => 2, 'move me' => 9, 'c' => 3, 'd' => 4, );
php arrays sorting associative-array
6个回答
13
投票
,我想在['b']之前移动['move me']。我只能使用4行代码来完成!
$i = 0; foreach($arr as &$val) $val = array('sort' => (++$i * 10), 'val' => $val);
$arr['move me']['sort'] = $arr['b']['sort'] - 5;
uasort($arr, function($a, $b) { return $a['sort'] > $b['sort']; });
foreach($arr as &$val) $val = $val['val'];


我发挥了一项易于使用的功能:



function move_item(&$ref_arr, $key1, $move, $key2 = null) { $arr = $ref_arr; if($key2 == null) $key2 = $key1; if(!isset($arr[$key1]) || !isset($arr[$key2])) return false; $i = 0; foreach($arr as &$val) $val = array('sort' => (++$i * 10), 'val' => $val); if(is_numeric($move)) { if($move == 0 && $key1 == $key2) return true; elseif($move == 0) { $tmp = $arr[$key1]['sort']; $arr[$key1]['sort'] = $arr[$key2]['sort']; $arr[$key2]['sort'] = $tmp; } else $arr[$key1]['sort'] = $arr[$key2]['sort'] + ($move * 10 + ($key1 == $key2 ? ($move < 0 ? -5 : 5) : 0)); } else { switch($move) { case 'up': $arr[$key1]['sort'] = $arr[$key2]['sort'] - ($key1 == $key2 ? 15 : 5); break; case 'down': $arr[$key1]['sort'] = $arr[$key2]['sort'] + ($key1 == $key2 ? 15 : 5); break; case 'top': $arr[$key1]['sort'] = 5; break; case 'bottom': $arr[$key1]['sort'] = $i * 10 + 5; break; default: return false; } } uasort($arr, function($a, $b) { return $a['sort'] > $b['sort']; }); foreach($arr as &$val) $val = $val['val']; $ref_arr = $arr; return true; }

示例:

move_item($arr, 'move me', 'up'); //move it one up move_item($arr, 'move me', 'down'); //move it one down move_item($arr, 'move me', 'top'); //move it to top move_item($arr, 'move me', 'bottom'); //move it to bottom move_item($arr, 'move me', -1); //move it one up move_item($arr, 'move me', 1); //move it one down move_item($arr, 'move me', 2); //move it two down move_item($arr, 'move me', 'up', 'b'); //move it before ['b'] move_item($arr, 'move me', -1, 'b'); //move it before ['b'] move_item($arr, 'move me', 'down', 'b'); //move it after ['b'] move_item($arr, 'move me', 1, 'b'); //move it after ['b'] move_item($arr, 'move me', 2, 'b'); //move it two positions after ['b'] //Special syntax, to swap two elements: move_item($arr, 'a', 0, 'd'); //Swap ['a'] with ['d']

我希望这对很多人有帮助,因为这是一个很棒的功能! :d


对于自定义排序,您可以例如创建一个数组,该数组是密钥的所需顺序,然后将值与它们关联。示例:

11
投票
$input = array("a"=>"Element A","b"=>"Element B","c"=>"Element C"); $order = array("c","a","b"); $out = array(); foreach($order as $k) { $out[$k] = $input[$k]; }

中的元素将按指定的顺序。

如果您要交换两个值,则可以这样做一个函数:

$out


2
投票

这里有很多困难的方法:)实际上,您可以利用preserve键功能。

function array_swap($key1, $key2, $array) { $newArray = array (); foreach ($array as $key => $value) { if ($key == $key1) { $newArray[$key2] = $array[$key2]; } elseif ($key == $key2) { $newArray[$key1] = $array[$key1]; } else { $newArray[$key] = $value; } } return $newArray; }
    

2
投票

array_slice()

示例:

$new_element = array('new_key' => 'value');

// if needed, find the insertion index by key
$index = array_search('key to search', array_keys($old_array));

// add element at index (note the last array_slice argument)
$new_array = array_slice($old_array, 0, $index+1, true) + $new_element + array_slice($old_array, $index+1, null, true);

2
投票
不幸的是,不幸的是与关联阵列配合使用,所以这里有些混乱:

function reorder_assoc_array( $cur, // current assoc array $order // array conaining ordered (subset of) keys in $cur ) { $result = []; // first copy ordered key/values to result array foreach($order as $key) { $result[$key] = $cur[$key]; // unset key in original array unset($cur[$key]); } // ... then copy all remaining keys that were not given in $order foreach($cur as $key => $value) { $result[$key] = $value; } return $result; }
    

i在此处基于一个答案,从而做出了一个函数。它需要对关联数组的数组进行排序,以及应将其求解的键数组
$assoc_arr = [
  'b' => 'bbb',
  'a' => 'aaa',
  'c' => 'ccc',
  'd' => 'ddd'
];

// suppose we want to swap the first two keys and leave the remaining keys as is
$assoc_arr = reorder_assoc_array($assoc_arr, ['a', 'b']);

// ... the order of keys is now a, b, c, d

0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.