Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tiago Souza Ribeiro

Criar array com valores de outros array na mesma posição

Recommended Posts

Olá.

Como posso criar um array contendo apenas valores de determinada chave/posição em outro array?

Por exemplo, tenho esse array:

$arr = array(
	"ya"=>array(
         "tal", "coisa"
    ),
	"yo"=>array(
         "abru", "blew"
    )
);

E quero criar um outro assim:

$n_arr = array(
    array(
         "tal", "abru" // Os primeiros valores de cada sub-array de $arr
    ),
    array(
         "coisa", "blew" // Os segundos valores de cada sub-array de $arr
    )
);

Obs. 1: Nem sempre os arrays terão apenas dois valores, pode ser qualquer quantidade!

Obs. 2: As chaves do array não serão sempre as mesmas, tem que funcionar com qualquer uma!

Obs. 3: As chaves do array lá do primeiro código são strings, mas as do segundo devem ser índices numéricos mesmo.

Como fazer isso independente da quantidade de valores, nome das chaves, etc...?

 

Fico no aguardo

Até mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

Explica melhor, por favor. E se puder usar a declaração normal do PHP para arrays melhor (eu pelo menos não tenho a 5.4 aqui).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troquei as declarações lá.

Vou tentar explicar melhor:

Tenho 1 array:

$arr = array();

Dentro desse array tenho valores com chaves string (não serão sempre 3 valores):

$arr = array("yo"=>"", "ya"=>"", "muy"=>"");

Esses valores são outros arrays:

$arr = array("yo"=>array(), "ya"=>array(), "muy"=>array());

Esses valores/arrays possuem todos a mesma quantidade de valores (não serão sempre 3 valores):

$arr = array(
	"yo"=>array(
         "eu", "hello", "me"
	),
	"ya"=>array(
         "yes", "sim", "ok"
	),
	"muy"->array(
         "muito", "very", "many"
	)
)

Nesse caso aí, eu queria que fossem criados 3 arrays (já que cada sub-array tem 3 valores) dentro de um novo array multidimensional. O primeiro array vai ter como valores o primeiro valor de cada sub-array. O segundo array vai ter o segundo valor de cada sub-array... e assim por diante:

$new_array = array(
	array("eu", "yes", "muito"), //Os primeiros valores de $arr["yo"], $arr["ya"] e $arr["muy"]
	array("hello", "sim", "very"), //Os segundos valores de $arr["yo"], $arr["ya"] e $arr["muy"]
	array("me", "ok", "many") //Os terceiros valores de $arr["yo"], $arr["ya"] e $arr["muy"]
);

Seria fácil se houvessem sempre 3 valores, e se houvessem apenas 3 sub-arrays, como no penúltimo código, porém eu posso uma vez criar 4 sub-arrays, 5 valores em cada ou 8 sub-arrays, 2 valores em cada, etc... nada é fixo.

Então, quero saber como transformar o penúltimo código no último, por exemplo.

 

Espero que tenha sido claro :D

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra fazer isso você vai precisar de muitos loops e muitas condições. Teu script vai ficar muito amarrado.

 

Tem como expor o problema no conceito real? De repente o que você realmente quer fazer dá pra fazer de uma forma melhor e sem gambiarras (que é o que vai sair desse bololô aí).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo.

Estou fazendo uma classe para fazer abstração de banco de dados, então ela tem métodos para select, update, insert (a causa dessa dúvida), entre outros. Atualmente a insert insere apenas um registro por vez, mas estou querendo fazer inserts múltiplos em um único query, e a forma de uso desse método (no caso de inserts múltiplos) é a seguinte:

insert("tabela", array(
	"campo1"=>array(
         "valor_para_registro1x", "valor_para_registro2x", "etc...x"
	),
	"campo2"=>array(
         "valor_para_registro1y", "valor_para_registro2y", "etc...y"
	)
));

Então eu precisaria que ao usar o método dessa maneira aí, fosse gerado o seguinte SQL:

INSERT INTO tabela (`campo1`, `campo2`) VALUES (`valor_para_registro1x`, `valor_para_registro1y`), (`valor_para_registro2x`, `valor_para_registro2y`), (`etc...x`, `etc...y`)

Como deve ter percebido, pelo tipo de função, nem sempre será apenas dois campos, nem apenas 3 valores para cada campo. Tem que funcionar com qualquer quantidade que seja.

 

Entendestes? ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Acho eu, que é isso que você está querendo.

 

$arr = array(
       "yo"=>array(
         "eu", "hello", "me"
       ),
       "ya"=>array(
         "yes", "sim", "ok"
       ),
       "muy"=>array(
         "muito", "very", "many"
       )
);

$array_limpo = array_values($arr);

 

Saida

 

array
 0 => 
   array
     0 => string 'eu' (length=2)
     1 => string 'hello' (length=5)
     2 => string 'me' (length=2)
 1 => 
   array
     0 => string 'yes' (length=3)
     1 => string 'sim' (length=3)
     2 => string 'ok' (length=2)
 2 => 
   array
     0 => string 'muito' (length=5)
     1 => string 'very' (length=4)
     2 => string 'many' (length=4)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, não é não '-'

Preciso que o resultado final seja esse:

$new_array = array(
       array("eu", "yes", "muito"), //Os primeiros valores de $arr["yo"], $arr["ya"] e $arr["muy"]
       array("hello", "sim", "very"), //Os segundos valores de $arr["yo"], $arr["ya"] e $arr["muy"]
       array("me", "ok", "many") //Os terceiros valores de $arr["yo"], $arr["ya"] e $arr["muy"]
);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, não é não '-'

Preciso que o resultado final seja esse:

$new_array = array(
       array("eu", "yes", "muito"), //Os primeiros valores de $arr["yo"], $arr["ya"] e $arr["muy"]
       array("hello", "sim", "very"), //Os segundos valores de $arr["yo"], $arr["ya"] e $arr["muy"]
       array("me", "ok", "many") //Os terceiros valores de $arr["yo"], $arr["ya"] e $arr["muy"]
);

 

Eu entendi um pouco sua idéia.

Mas se todos os array são dinâmico. e pode ter valores variados 2,8,etc. Vai ocorrer uma anomalia no código, menos chave para muitos values.

 

Uma dica.

 

Se precisar do nome do array. Deixa, e depois conta os valores.

 

Exemplo: $arr["yo"][0], $arr["yo"][1], $arr["yo"][2]

 

 

Se não é isso, esquece não compreendi :D

 

Um abraço e boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não foi uma boa ideia eu usar 3 chaves e 3 valores, deve ter confundido um pouco...

Outro exemplo... Isso:

$arr = array(
     "yo"=>array(
         "eu", "hello", "me", "lhe", "pow"
	),
     "ya"=>array(
         "yes", "sim", "ok", "poser", "uhum"
	),
     "muy"=>array(
         "muito", "very", "many", "abru", "xis"
	)
     "other"=>array(
         "outro", "oter", "ala", "com", "net"
	)
);

Se torna nisso:

$new_array = array(
	array("eu", "yes", "muito", "outro"), //Os primeiros valores de $arr["yo"], $arr["ya"], $arr["muy"] e $arr["other"]
	array("hello", "sim", "very", "oter"), //Os segundos valores de $arr["yo"], $arr["ya"], $arr["muy"] e $arr["other"]
	array("me", "ok", "many", "ala") //Os terceiros valores de $arr["yo"], $arr["ya"], $arr["muy"] e $arr["other"]
	array("lhe", "poser", "abru", "com") //Os quartos valores de $arr["yo"], $arr["ya"], $arr["muy"] e $arr["other"]
	array("pow", "uhum", "xis", "net") //Os quintos valores de $arr["yo"], $arr["ya"], $arr["muy"] e $arr["other"]
);

Não importa a quantidade de valores ou chaves...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por quê, Deus! Por quê eu não prestei mais atenção nas aulas de matemática? :lol:

 

Eu fiquei bastante tempo aqui matutando como que eu poderia fazer isso, tentei várias possibilidades com loops aninhados, iteradores recursivos e nada.

 

Quando finalmente o cérebro troll ataca novamente: "Ô animal, você precisa simplesmente transpor a matriz!"

 

E pimba!

 

function transpose( $array ) {

   array_unshift( $array, null );

   return call_user_func_array( 'array_map', $array );
}

Mãe da misericórdia, eu não acredito nisso. smileyvault-slaphead.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi foi nada dessa função sua, upset.gif

Executei ela no array não fez nada e ainda retornou um warning '-'

array_map(): Argument #5 should be an array in

Talvez tenha executado no lugar errado, mas por sua explicação, não consigo adivinhar como fazer, kkk

 

> Edit:

Até que enfim minha cabeça funcionou :D

Resolvi com isso:

$arr = array(
     "yo"=>array(
         "eu", "hello", "me", "lhe", "pow"
       ),
     "ya"=>array(
         "yes", "sim", "ok", "poser", "uhum"
       ),
     "muy"=>array(
         "muito", "very", "many", "abru", "xis"
       )
     "other"=>array(
         "outro", "oter", "ala", "com", "net"
       )
);

$data = array();

foreach($arr as $array) {
       foreach($array as $key=>$value) {
               $data[$key][] = $value;
       }
}

Se tiver um jeito melhor, agradeço, mas esse aí já está funcionando perfeitamente \õ/

Obrigado a todos que ajudaram.

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você não postou o array real, muito provavelmente o array que você está informando tem algum elemento que não seja um array, porque aqui funcionou direitinho:

 

$arr = array(

   'yo' => array(

       'eu', 'hello', 'me', 'lhe', 'pow'
   ),

   'ya' => array(

       'yes', 'sim', 'ok', 'poser', 'uhum'
   ),

   'muy' => array(

       'muito', 'very', 'many', 'abru', 'xis'
   ),

   'other' => array(

       'outro', 'oter', 'ala', 'com', 'net'
   )
);

function transpose( $array ) {

   array_unshift( $array, null );

   return call_user_func_array( 'array_map', $array );
}

var_dump( transpose( $arr ) );

Saída:

 

array
 0 => 
   array
     0 => string 'eu' (length=2)
     1 => string 'yes' (length=3)
     2 => string 'muito' (length=5)
     3 => string 'outro' (length=5)
 1 => 
   array
     0 => string 'hello' (length=5)
     1 => string 'sim' (length=3)
     2 => string 'very' (length=4)
     3 => string 'oter' (length=4)
 2 => 
   array
     0 => string 'me' (length=2)
     1 => string 'ok' (length=2)
     2 => string 'many' (length=4)
     3 => string 'ala' (length=3)
 3 => 
   array
     0 => string 'lhe' (length=3)
     1 => string 'poser' (length=5)
     2 => string 'abru' (length=4)
     3 => string 'com' (length=3)
 4 => 
   array
     0 => string 'pow' (length=3)
     1 => string 'uhum' (length=4)
     2 => string 'xis' (length=3)
     3 => string 'net' (length=3)

Isso porque TODOS os elementos, de todos os índices, do array principal são arrays.

 

Como eu sei disso? Simples, ao adicionar uma string qualquer nesse array de entrada, eu pude reproduzir o mesmo erro que você.

 

Infelizmente parece não ser possível forçar o cast de todos os elementos de um array recursivamente sem iterá-lo. Pelo menos eu não consegui. :pinch:

 

Assim, iterar por iterar faça tudo de uma vez, convertendo e transpondo a matriz.

 

A propósito, essa forma que fez ainda não é à prova de falhas já que adicionando esse mesmo elemento string intruso que eu falei, o array resultante seria transposto sim, mas o foreach reclamaria que o argumento recebido não é um array.

 

Mesmo que seja fácil de corrigir, forçando o cast em cada foreach, ainda assim o elemento string continuaria presente. E pior, intocado (ainda string)

 

Uma versão "aprimorada" dessa solução seria:

 

function transpose( $arr ) {

   $out = array();

   foreach( (array) $arr as $key => $subarr ) {

   	foreach( (array) $subarr as $subkey => $subvalue ) {

           $out[ $subkey ][ $key ] = $subvalue;
       }
   }

   return $out;
}

Que além de manter os índices associativos não dá problema com índices "quebrados", pois estes serão tranpostos em tantos índices quantos valores existirem.

 

A vantagem da primeira função em relação à segunda é que a primeira manterá todos os sub-arrays com a mesma quantidade de elementos (completando com NULL onde necessário) o que reforça o conceito de transposição de matrizes.

 

Já a segunda não.

 

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Todos valores do array serão arrays. Esse processo todo citado aqui no tópico só será realizado se o insert a ser executado, como disse no post #5, for múltiplo. E para garantir que todos tenham o mesmo tamanho, e que valores não definidos sejam tomados como NULL no SQL, antes é a aplicada a solução que obtive nesse tópico: http://forum.imaster...anho-com-outro/

Para haver alguma string deveria ser um insert simples, e nesse caso, nada citado aqui no tópico e realizado :P

Além disso, esse primeiro método seu iria modificar o array de uma forma que iria causar vários problemas aqui...

Fora isso tudo, suas alternativas seriam válidas :D

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.