Diferença entre "as $key => $value" e "as $value" no PHP foreach

Tenho uma chamada da base de dados e estou a tentar descobrir o que o $key => $valuefaz num ciclo foreach.

A razão pela qual pergunto é porque ambos os códigos dão a mesma coisa, por isso estou a tentar perceber porque está escrito assim. Aqui está o código:

foreach($featured as $key => $value){
  echo $value['name'];
}

isto produz o mesmo que:

foreach($featured as $value) {
  echo $value['name']
}

Então a minha pergunta é, Qual é a diferença entre $key => $value ou apenas $value no loop foreach. A matriz é multidimensional, se isso faz a diferença, só quero saber porquê. passar $key para $value no circuito foreach.

Author: rink.attendant.6, 2013-08-28

7 answers

Bem, o $key => $value no laço foreach refere-se aos pares de valores-chave em arrays associativos, onde a chave serve como índice para determinar o valor em vez de um número como 0,1,2,... Em PHP, as matrizes associativas são assim:

$featured = array('key1' => 'value1', 'key2' => 'value2', etc.);

No código PHP: $featured é a matriz associativa sendo loop através de e as $key => $value significa que cada vez que o loop é executado e seleciona um par chave-valor da matriz, ele armazena a chave no local $key variável para usar dentro do bloco do laço e o valor na variável local $value. Assim, para o nosso conjunto de exemplos acima, o laço foreach alcançaria o primeiro par de valores de chave, e se você especificasse as $key => $value, ele armazenaria 'key1' na variável $key e 'value1' na variável $value.

Uma vez que você não usa a variável $key dentro do seu bloco de loop, adicioná-la ou removê-la não altera a saída do loop, mas é melhor incluir o par chave-valor para mostrar que é uma matriz associativa.

Note também que as $key => $value a designação é arbitrária. Você poderia substituir isso por as $foo => $bar e funcionaria bem desde que você mudasse as referências variáveis dentro do bloco loop para as novas variáveis, $foo e $bar. Mas fazê-las ajuda a manter o rasto do que significam.

 61
Author: djiango, 2013-08-28 16:08:47
Digamos que tem uma matriz associativa como esta:
$a = array(
    "one" => 1,
    "two" => 2,
    "three" => 3,
    "seventeen" => array('x'=>123)
);

Na primeira iteração: $key="one" e $value=1.

Às vezes você precisa desta chave ,Se você quiser apenas o valor , você pode evitar usá-la.

Na última iteração : $key='seventeen' e $value = array('x'=>123) para obter o valor do primeiro elemento deste valor array, você precisa de um key, x neste caso: $value['x'] =123.

 15
Author: Charaf JRA, 2014-08-04 14:08:14
Um lugar muito importante onde está necessário para usar o par key => value em foreach laço deve ser mencionado. Suponha que você gostaria de adicionar um novo/sub-elemento a um item existente (noutra chave) na lista $features. Deve fazer o seguinte:
foreach($features as $key => $feature) {
    $features[$key]['new_key'] = 'new value';  
} 


Em vez disto:

foreach($features as $feature) {
    $feature['new_key'] = 'new value';  
} 
A diferença aqui é que, no primeiro caso, você está acessando o sub-valor do array através do próprio array principal com um chave para o elemento que está sendo apontado pelo ponteiro array.

Enquanto no segundo ( que não funciona para este propósito) Você está a atribuir o sub-valor na matriz a uma variável temporária $feature que está desactivada após cada iteração de laço.

 8
Author: Ahmad Baktash Hayeri, 2015-06-11 06:45:58

A diferença é que no

foreach($featured as $key => $value){
 echo $value['name'];
}
És capaz de manipular o valor de cada iteração a partir do seu par de valores-chave. Como @djiango respondeu, Se você não estiver manipulando cada valor $key, o resultado do loop será exatamente o mesmo que
foreach($featured as $value) {
  echo $value['name']
}

Fonte: Você pode lê-lo a partir da documentação do PHP:

O primeiro formato faz loops sobre o array dado por array_ expression. Em cada iteração, o valor >da o elemento actual é atribuído a $value e o ponteiro interno da matriz é avançado por >one (por isso, na próxima iteração, você estará a olhar para o próximo elemento).*

O segundo formulário irá adicionalmente atribuir a chave do elemento actual à variável $key em >cada iteração.


Se os dados que está a manipular são, digamos, matrizes com teclas personalizadas, pode imprimi-los no ecrã assim:

$array = ("name" => "Paul", "age" => 23);

foreach($featured as $key => $value){
 echo $key . "->" . $value;
}

Print:

name->Paul

age->23

E não seria capaz de fazer isso com a mesma facilidade. Então considere o formato acima uma maneira conveniente de manipular chaves quando necessário. Saúde.
 6
Author: sargas, 2014-02-03 22:00:30
Diga que tem uma matriz como esta:
$array = (0=>'123',1=>'abc','test'=>'hi there!')

Em cada loop, cada loop seria:

$key = 0, $value = '123'
$key = 1, $value = 'abc'
$key = 'test', $value = 'hi there!'
É óptimo para aqueles momentos em que precisamos de saber a chave do array.
 3
Author: aynber, 2013-08-28 16:04:06

Se a matriz se parecer com:

  • $featured ["fruit"] = "orange";
  • $featured ["fruit"] = "banana";
  • $featured ["vegetable"] = "carrot";

A chave $deterá o tipo (fruta ou legumes) para cada valor da matriz (laranja, banana ou cenoura)

 2
Author: 3seconds, 2013-08-28 16:05:01

Aqui $key conterá a $key associada a $value em $featured . A diferença é que agora tens essa chave.

array("thekey"=>array("name"=>"joe"))

Aqui o valor é

array("name"=>"joe")

$a chave é "a chave"

 1
Author: Thomas Martin Klein, 2013-08-28 16:03:27