2014-01-24 3 views
0

Как переместить ассоциированный ключ в массив так, чтобы он был после другого указанного ключа?Переместить ассоциативный массив в массив

Например, выходной ток $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

Почему? Кажется, что эти значения не должны быть порядковыми. –

+0

Они столбцы для таблицы, и я хочу изменить порядок их вывода. Благодарю. –

+0

@DavidGard, почему бы не изменить порядок в таблице? Или изменить порядок, который они загружают из таблицы в вашем запросе? – Styphon

ответ

2

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

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

+0

Пятно, даже добавляет возможность выполнять работу с помощью разных клавиш. Благодарю. –

-1

Вы можете сделать это с array_splice смотрите here или воспользуйтесь пользовательским номером sort function.

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-из-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

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

В общем:

  1. Разделите свой текущий массив на две части ($larray, $rarray) - до и после места вы хотите вставить свой ключ (например, используя foreach).

  2. Добавить новый ключ к концу левой стороны, например $larray = $larray + array('key' => 'value')

  3. Добавить правую сторону, что: `$ массив = $ larray + $ RArray»

Это хорошо иногда не копировать-вставить решения для Интернета, а просто понимать их. Это весело!

+0

Точно. Если кто-то хочет намекнуть, посмотрите [здесь] (http://stackoverflow.com/a/21336407/). ;) –

+0

Спасибо, но понимание логики - легкая часть. Не то, что я ищу в этом случае. –

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 
) 
Смежные вопросы