Existe uma maneira de encomendar uma matriz associativa por como as chaves são inseridas com PHP?

StackOverflow https://stackoverflow.com/questions/1124679

  •  13-09-2019
  •  | 
  •  

Pergunta

Aqui está um exemplo do que quero dizer:

Eu tenho uma matriz:

array('type'=>'text', 
      'class'=>'input', 
      'name'=>'username', 
      'id'=>'username', 
      'value'=>'', 
      'size'=>'30', 
      'rows'=>'',
    'cols'=>'');

Então, eu percorro assim:

$input = '<input ';
    foreach($input_array as $key => $value) {
        if(isset($key) && !empty($key)) {
            $input .= $key . '="' . $value . '" ';
        }   
    }   
$input .= '/>';

Espero voltar:

<input type="text" class="input" name="username" id="username" size="30" />

Eu tentei usar funções de classificação do PHP () sem sucesso. O mais próximo que posso imaginar é que precisava usar algo como USORT (), mas estou tendo problemas para descobrir como escrever uma função que fará o que eu quiser.

Qualquer conselho sobre este tópico é muito apreciado e muito obrigado pela leitura.

Foi útil?

Solução

Já deveria estar nessa ordem. As matrizes PHP são classificadas para que os elementos estejam na ordem em que você os inseriu.

Você também precisa ligar empty() sobre $value não $key; $key deve sempre estar não vazio. Você também não precisa isset() assim como empty(). Além disso, seu código funciona bem e produz a saída desejada.

Eu também ficaria cauteloso em usar empty() Porque ele retornará verdadeiro para uma string '0'. Esse pode ser um valor de parâmetro válido que seria ignorado. Você poderia verificar isso strlen($value) > 0.

Outras dicas

Executando o código a seguir através da linha de comando interativa do PHP apenas afirma Tom HaighDeclaração

Já deveria estar nessa ordem. As matrizes PHP são classificadas para que os elementos estejam na ordem em que você os inseriu.

<?php
$a = array(
    'type'=>'text',
    'class'=>'input',
    'name'=>'username',
    'id'=>'username',
    'value'=>'',
    'size'=>'30',
    'rows'=>'',
    'cols'=>''
);
print_r($a);
/* 
Array
(
    [type] => text
    [class] => input
    [name] => username
    [id] => username
    [value] =>
    [size] => 30
    [rows] =>
    [cols] =>
) 
*/
foreach ($a as $k => $v) {
    echo $k . ' => ' . $v . "\n";
}
/* 
type => text
class => input
name => username
id => username
value =>
size => 30
rows =>
cols =>
*/

Você tem certeza de que esse é exatamente o código que você está usando e não há nada acontecendo para $input_array entre criação e loop?

EDITAR:

Apenas uma pergunta simples e talvez estúpida: onde você verifica como a string resultante em $input parece? Se você o fizer, por exemplo, o HTML Navigator da Firebug, a ordem dos atributos não corresponderá à ordem real na fonte HTML, pois o Firebug exibe a árvore Dom gerada a partir da fonte (e potencial manipulação de JavaScript), o que significa que ela pode reordenar os atributos à vontade ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top