PHP: Mova o elemento da matriz associativa para o início da matriz

94

Qual seria o melhor método para mover qualquer elemento de uma matriz associativa para o início da matriz?

Por exemplo, digamos que eu tenha a seguinte matriz:

$myArray = array(
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one'   => 'Blah Blah Blah 1',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

O que eu quero fazer é mover o elemento 'um' para o início e terminar com a seguinte matriz:

$myArray = array(
    'one'   => 'Blah Blah Blah 1',
    'two'   => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'four'  => 'Blah Blah Blah 4',
    'five'  => 'Blah Blah Blah 5',
);

fonte

Respostas:

182

Você pode usar o operador de união de matriz ( +) para unir a matriz original a uma nova matriz associativa usando a chave conhecida ( one).

$myArray = array('one' => $myArray['one']) + $myArray;
// or      ['one' => $myArray['one']] + $myArray;

As chaves da matriz são exclusivas, portanto, seria impossível existir em dois locais.

Consulte php.net/manual/en/language.operators.array.php:

O operador + retorna a matriz à direita anexada à matriz à esquerda; para as chaves que existem em ambas as matrizes, os elementos da matriz à esquerda serão usados ​​e os elementos correspondentes da matriz à direita serão ignorados.

Mark Eirich
fonte
3
@andrewtweber Não, não sei, mas fiz alguns testes e descobri que, em comparação com a abordagem de Emil, é 3x mais rápido e ocupa a metade da memória. Também descobri que leva 20% mais tempo do que mover o mesmo elemento para o final da matriz.
Mark Eirich
5

Se você tiver chaves de array numéricas e quiser reindexar as chaves de array, seria melhor colocá-lo array_mergeassim:

$myArray = array_merge(array($key => $value) + $myArray );
trante
fonte
2

Um pouco tarde, mas caso alguém precise, criei este pequeno trecho.

function arr_push_pos($key, $value, $pos, $arr) 
{
    $new_arr = array();
    $i = 1;

    foreach ($arr as $arr_key => $arr_value) 
    {
        if($i == $pos) 
            $new_arr[$key] = $value;

        $new_arr[$arr_key] = $arr_value;

        ++$i;
    }

    return $new_arr;
}

Basta ajustá-lo para atender às suas necessidades ou usá-lo e remover o índice para mover. Também funciona com matrizes associativas.

Sune
fonte
Uma correção: $ new_arr [$ arr_key] = $ arr_value; Deve ser: if ($ arr_key! = $ Key) $ new_arr [$ arr_key] = $ arr_value; Mas fora isso: excelente! 1 para cima.
nzn
1

Aqui está outra linha simples que faz isso usando array_splice():

$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
Billynoah
fonte
1

se você tem 2 arrays, o primeiro tem elementos para mover para o topo do segundo array de elementos, você pode usar

$result = \array_replace($ArrayToMoveToTop, $myArray);

Aqui está um exemplo de código:

//source array    
$myArray = [
    'two' => 'Blah Blah Blah 2',
    'three' => 'Blah Blah Blah 3',
    'one' => 'Blah Blah Blah 1',
    'four' => 'Blah Blah Blah 4',
    'five' => 'Blah Blah Blah 5',
];
// set necessary order
$orderArray = [
    'one' => '',
    'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);
Eugene Kaurov
fonte
-1

Há uma função nos comentários do manual do PHP para array_unshift que pode ser usada para adicionar um elemento, com chave, ao início de um array:

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return array_reverse($arr, true);
}

Remova o elemento e insira-o novamente com a função acima:

$tmp = $myArray['one'];
unset($myArray['one']);
$myArray = array_unshift_assoc($myArray, 'one', $tmp);

Uma abordagem mais geral pode ser usar uksort para classificar seu array por chaves e fornecer uma função de classificação própria.

Emil Vikström
fonte
Oi - obrigado pela resposta, embora eu não queira classificar a matriz de forma alguma. Quero ser capaz de conhecer uma chave de elementos e mover apenas esse elemento específico para o início da matriz
Acho que o "=" é um erro de sintaxe:return = array_reverse($arr, true);
Mark Eirich
Além disso, quando executo seu código, obtenho uma matriz com apenas um elemento ... :-(
Mark Eirich