2012-07-01 5 views
6

В php я хотел бы иметь возможность переупорядочить ассоциативный массив, перемещая элементы в определенные позиции в массиве. Не нужен сорт, просто переупорядочение по моему выбору.PHP: упорядочить ассоциативный массив

В качестве примера, скажем, у меня есть ассоциативный массив следующим образом:

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

и в одном случае я может потребоваться переместить С перед B и имеют следующий результат:

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

или в другом случае я могу переместить C до A и получить следующий результат:

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

Что я пытаюсь показать , просто метод для выражения «Эй, я хочу переместить этот элемент массива перед этим другим элементом массива» или «Привет, id, чтобы переместить этот элемент массива, чтобы убедиться, что он появился после этого другого элемента массива»

Надеюсь, это имеет смысл!

Спасибо всем, заранее, кто заботится, чтобы помочь мне с этим

+1

Ассоциированный массив (ов) не имеет никакого заказа. – DonCallisto

+13

@DonCallisto: Это абсолютно неверно. Массивы также являются списками, и как таковые определенно имеют четко определенный порядок. – Jon

+0

Возможный дубликат [Сортировка массива с использованием другого массива] (http://stackoverflow.com/questions/8935093/sort-array-using-another-array) – nickb

ответ

2

Если вы имеете в виду, чтобы поменять два значения, которые вы могли бы сделать такую ​​функцию:

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; 
    } 
+1

Спасибо за ответ, но мне нужно также переместить клавиши, а не только значения –

+0

Теперь попробуйте новую функцию –

8

Для пользовательской сортировки, вы можете, например, создать массив, который является желаемым порядком ключей, а затем связать значения с ними. Пример:

$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 будут находиться в указанном порядке.

+0

Это не сработает для моей проблемы. Мне нужно переместить один элемент до или после другого элемента. Поэтому мой метод будет иметь только два ключа –

0

array_splice, к сожалению, не работает с ассоциативными массивами, так вот что-то немного хаотичным:

$keys = array_keys($arr); 
$values = array_values($arr); 

$keyIndex = array_search($someKey, $keys); 
array_splice($keys, $keyIndex, 1); 
array_splice($values, $keyIndex, 1); 

$insertIndex = 1; 
array_splice($keys, $insertIndex, 0, array($someKey)); 
array_splice($values, $insertIndex, 0, array($arr[$someKey])); 

$arr = array_combine($keys, $values); 
7
$arr = array(
    'a' => 1, 
    'b' => 2, 
    'move me' => 9, 
    'c' => 3, 
    'd' => 4, 
); 

Эй, я хочу переместить ['move me'] до ['b']. Я могу сделать это только с 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

1

Здесь много сложных методов: На самом деле вы можете использовать функцию сохранения ключей 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); 
Смежные вопросы