Como armazenar valores de loop foreach em uma matriz?


115

Precisa armazenar valores de foreach loop em um array, precisa de ajuda para fazer isso.

O código abaixo não funciona, apenas armazena o último valor, tentado, $items .= ...,mas também não está funcionando, qualquer ajuda será apreciada.

foreach($group_membership as $i => $username) {
    $items = array($username);
}

print_r($items);

12
.=acrescenta texto. []anexa em uma matriz.
Skilldrick de

De longe, Skilldrick acertou em cheio com o forro acima, sem necessidade de prosseguir.
user1946891

Respostas:


255

Declare a $itemsmatriz fora do loop e use $items[]para adicionar itens à matriz:

$items = array();
foreach($group_membership as $username) {
 $items[] = $username;
}

print_r($items);

7
Além disso, não extraia a chave ( $i) se não for usá-la.
Matteo Riva

2
Declarar $items = array();antes do foreach nem é necessário, certo? php irá apenas criar uma matriz vazia
BassMHL

o que aconteceria se alguns dos $ username fossem nulos? Temos uma situação semelhante em que os registros vêm de uma API e, de alguma forma, acabamos com alguns registros nulos no array.
pixelwiz de


7

Experimentar

$items = array_values ( $group_membership );

1
Bem, suponho que o loop foreach está fazendo mais do que isso, caso contrário, esta é a melhor solução.
Matteo Riva

5
<?php 
$items = array();
$count = 0;
foreach($group_membership as $i => $username) { 
 $items[$count++] = $username; 
} 
print_r($items); 
?>

3
Não há necessidade de coisas de $ count. Apenas $ array [] = $ coisa;

Vou adiar a votação desta resposta, embora: 1. É uma resposta apenas de código que 2. Ensina aos desenvolvedores práticas desnecessárias / ruins ... porque esta é uma grande chance de fazer a coisa Disciplinada e tornar Stackoverflow um recurso melhor .
mickmackusa

Eu tenho problema onde meu array retorna apenas o último elemento que foi colocado no array. Usar a contagem sugerida por você resolveu meu problema.
Jass Preet

2

Você pode tentar fazer minha resposta,

você escreveu isto:

<?php
foreach($group_membership as $i => $username) {
    $items = array($username);
}

print_r($items);
?>

E no seu caso eu faria isso:

<?php
$items = array();
foreach ($group_membership as $username) { // If you need the pointer (but I don't think) you have to add '$i => ' before $username
    $items[] = $username;
} ?>

Como você mostra em sua pergunta, parece que você precisa de uma matriz de nomes de usuário que estão em um grupo específico :) Neste caso, eu prefiro uma boa consulta sql com um loop while simples;)

<?php
$query = "SELECT `username` FROM group_membership AS gm LEFT JOIN users AS u ON gm.`idUser` = u.`idUser`";
$result = mysql_query($query);
while ($record = mysql_fetch_array($result)) { \
    $items[] = $username; 
} 
?>

whileé mais rápido, mas o último exemplo é apenas o resultado de uma observação. :)


0
$items=array(); 
$j=0; 

foreach($group_membership as $i => $username){ 
    $items[$j++]=$username; 
}

Apenas tente o acima em seu código.


Esta resposta apenas de código não deve ser usada por nenhum desenvolvedor. O contador e o incremento não são necessários.
mickmackusa

0

Só para evitar muitos erros de digitação:

foreach($group_membership as $username){
        $username->items = array(additional array to add);
    }
    print_r($group_membership);

-1

esta questão parece muito antiga, mas caso você passe por ela, você pode usar a função embutida do PHP array_push () para enviar dados em um array usando o exemplo abaixo.

<?php
    $item = array();
    foreach($group_membership as $i => $username) {
        array_push($item, $username);
    }
    print_r($items);
?>

Fazer chamadas de função iteradas é ineficiente. A sintaxe de envio de colchetes (sugerida 8 anos antes) será mais eficiente. Essa resposta não deve ser usada para inserir elementos únicos em uma matriz. (e a declaração de $ié inútil)
mickmackusa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.