2016-01-14 4 views
0

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

$array[0 => 0 
     1 => 1, 
     2 => 2, 
     3 => 3, 
     4 => 4, 
     5 => 5, 
     6 => 6, 
     7 => 7, 
     8 => 8, 
     9 => 9, 
     10 => 10 ]; 

И второй массив, определяющий новый порядок для конкретных элементов (в то время как автоматически повторно заказав тех, кого он будет конфликтовать с):

$reordered[3 => 4, 
      7 => 9, 
      6 => 1 ]; 

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

$array[0 => 0 
     1 => 2, 
     2 => 3, 
     3 => 4, 
     4 => 5, 
     5 => 6, 
     6 => 1, 
     7 => 9, 
     8 => 7, 
     9 => 8, 
     10 => 10 ]; 

Обратите внимание, как, где элемент заменяемого, остальные Переиндексирован (в то время как уважая configurati на $ reordered array).

Что является самым элегантным способом достижения этого?

+1

Нам нужны мо re информацию о правилах размещения измененных, но не отображаемых в $ переупорядоченных страницах. Ex. страница 7 переходит к индексу 8, но 6 переместилась на 5. Это противоречивое линейное поведение и должно иметь некоторые правила. В настоящее время порядок $ reordered может повлиять на конечный результат. –

+0

вы попробовали ответить? –

ответ

0

Следующий код делает работу:

asort($reordered); 
foreach ($reordered as $position => $item) { 
    $sliced = array_splice($array, array_search($item, $array), 1); 
    array_splice($array, $position, 0, $sliced); 
} 
print_r($array); 

Выходы:

Array 
(
    [0] => 0 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
    [5] => 6 
    [6] => 1 
    [7] => 9 
    [8] => 7 
    [9] => 8 
    [10] => 10 
) 

Или вы можете использовать функцию reorder из Nspl. Он имеет следующую подпись:

reorder(array $list, $from, $to) 

Решение будет:

use function nspl\a\reorder; 

asort($reordered); 
foreach ($reordered as $position => $item) { 
    $array = reorder($array, array_search($item, $array), $position); 
} 
0

попробовать это: лучший способ. Надеюсь, я решил вашу проблему. используйте array_search (массив $ 2, $); дает 2. найти и проиндексировать, чтобы заменить значение, как указано ниже.

<?php 
$array=array(0=>0,1=>1,2=>2,3=>3,4=>4,5=>5,6=>6,7=>7,8=>8,9=>9); 
$r=array(4=>2,5=>4,3=>6); 
print_r($array); 
echo "<br>"; 
$count=count($array); 
foreach($r as $key =>$val){ 
$a=$array[$key]; 
$keyu = array_search($val, $array); 
$array[$keyu]=$a; 
$array[$key]=$val; 
} 
print_r($array); 
?> 

результат:

Array ([0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9) 
Array ([0] => 0 [1] => 1 [2] => 5 [3] => 6 [4] => 2 [5] => 4 [6] => 3 [7] => 7 [8] => 8 [9] => 9) 
+0

вам нужно улучшить свой ответ. он не работает – Monty

+0

@Monty: сначала вы запустили мой ответ. где он дает ошибку? –

+0

@Monty без всякой причины не комментируйте. его раздражает. –

0

Его рабочий Попробуйте это:

$old = range(100,110); 
$order = array(3=>4,6=>1,7=>9); 

function match($old,$order){ 
    foreach ($old as $k => $v){ 
     if(array_key_exists($k, $order)){ 
      $new[] = $order[$k]; 
     }else{ 
      $new[] = $v; 
     } 
    } 
    return $new; 
} 
echo "<pre>"; 
print_r($old); 
print_r($order); 
print_r(match($old,$order)); 

ВЫВОД:

Array 
(
    [0] => 100 
    [1] => 101 
    [2] => 102 
    [3] => 103 
    [4] => 104 
    [5] => 105 
    [6] => 106 
    [7] => 107 
    [8] => 108 
    [9] => 109 
    [10] => 110 
) 
Array 
(
    [3] => 4 
    [6] => 1 
    [7] => 9 
) 
Array 
(
    [0] => 100 
    [1] => 101 
    [2] => 102 
    [3] => 4 
    [4] => 104 
    [5] => 105 
    [6] => 1 
    [7] => 9 
    [8] => 108 
    [9] => 109 
    [10] => 110 
) 
+0

запустите ваш $ old = range (0,10). Ответьте на вопрос, просто вы заменили значение индекса только где переделать? –

+0

его работающий штраф, вы проверите еще раз. – Monty

+0

будет работать, но вы можете изменить порядок массива, так что вы получите повторяющиеся значения. OP dosnt нуждается в этом выходе. –

Смежные вопросы