Ir para conteúdo

POWERED BY:

Arquivado

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

wBB

Mesclar arrays

Recommended Posts

Pessoal,

Gostaria de uma ajudinha numa operação com arrays. Considerando os seguintes arrays:

 

Array1: $aa, se executar uma VAR_DUMP nele mostrará:

array(5) { [0]=> int(-1) [1]=> int(-2) [2]=> int(1) [3]=> int(-3) [4]=> int(-4) }

 

Array2: $bb, se executar uma VAR_DUMP nele mostrará:

array(5) { [0]=> string(1) "n" [1]=> string(1) "n" [2]=> string(1) "p" [3]=> string(1) "n" [4]=> string(1) "n" }

 

Gostaria de unir os dois, de forma que o resultado seja:

 

Array (5) {
	["n"]=>-1
	["n"]=>-2
	["p"]=>1
	["n"]=>-3
	["n"]=>-4
}
Tem como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, não sei se você chegou a testar esta função, mas o resultado dela se aplicada aos array que indiquei será:

$cc = array_merge($aa, $bb);
var_dump($cc) =
array(10) { [0]=> int(-1) [1]=> int(-2) [2]=> int(1) [3]=> int(-3) [4]=> int(-4) [5]=> string(1) "n" [6]=> string(1) "n" [7]=> string(1) "p" [8]=> string(1) "n" [9]=> string(1) "n" }
$cc = array_merge($bb, $aa);
var_dump($cc) =
array(10) { [0]=> string(1) "n" [1]=> string(1) "n" [2]=> string(1) "p" [3]=> string(1) "n" [4]=> string(1) "n" [5]=> int(-1) [6]=> int(-2) [7]=> int(1) [8]=> int(-3) [9]=> int(-4) }
Será que estou fazendo algo errado? Existe outra maneira de aplicar o array_merge?

Está criando um array de 10 posiçoes, ou seja, está concatenando os arrays em lugar de transformar um em índice do outro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah, você quer que os valores do segundo array tornem-se osíndices do primeiro array. É isso?

Crie o novo array usando um loop, utilizando os valores retornados por array_keys() e array_values(). http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe, não entendi.

Já usei essas duas funções também (e várias outras do manual...), mas não consegui obter o resultado abaixo. Você poderia dar um exemplo?

 

Resultado esperado:

Array (5) {
	["n"]=>-1
	["n"]=>-2
	["p"]=>1
	["n"]=>-3
	["n"]=>-4
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas dessa forma, seu array final vai ter chaves iguais: Olha só:

 

<?php
	$v = array(-1, -2, 1, -3, -4);
	$k = array("n", "n", "p", "n", "n");
	$c = array_combine($k, $v);
	var_dump($c);
?>

Isso vai gerar:

 

array(2) {
  ["n"]=>int(-4)
  ["p"]=>int(1)
}

Ou seja, em uma mesma chave (com mesmo nome) ele coloca somente o último valor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, agradeço sua atenção, mas não é isso que preciso.

A resposta do array_combine que você sugeriu, dá como retorno um array de 2 posições. E as outras?

Meu array $aa tem 5 posições. O mesmo para o array $bb. O resultado que preciso é um array também de 5 posições, conforme o exemplo:

Array (5) {
	["n"]=>-1
	["n"]=>-2
	["p"]=>1
	["n"]=>-3
	["n"]=>-4
}
mesmo assim obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas então: posso estar errado, mas acho que você não consegue o que você quer, porque voce está repetindo as chaves da sua Array, elas tem o mesmo nome, e isso é impossível. Nesse seu caso, você não consegue pegar o primeiro ítem da sua Array, porque, como você fez uma associação chave=>valor, não existe mais Array[0], Array[1],... e sim Array['n'] e Array['p'] (nesse caso). E se você faz um Array['n'] ele pega o último valor associado à essa chave, que nesse caso é -4.

 

O que você pode fazer, é criar uma array bidimensional, mas não sei se te ajuda. Algo como:

 

Array (5) {
	Array(1){
		["n"]=>-1
	}
	Array(1){
		["n"]=>-2
	}
	Array(1){
		["p"]=>1
	}
	Array(1){
		["n"]=>-3
	}
	Array(1){
		["n"]=>-4
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Mario. Entendi.

E será que tem como gerar o array que você sugeriu a partir dos dois arrays que tenho?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra você gerar esse tipo de array que falei, um dos modos pode ser esse:

 

<?php
	$aa = array(-1, -2, 1, -3, -4);
	$bb = array("n", "n", "p", "n", "n");
	$cc = array();
	foreach(array_keys($aa) as $k) {
		$cc[$k] = array($bb[$k]=>$aa[$k]);
	}
	var_dump($cc);
?>

Isso vai gerar:

 

array(5) {
  [0]=>
  array(1) {
	["n"]=>
	int(-1)
  }
  [1]=>
  array(1) {
	["n"]=>
	int(-2)
  }
  [2]=>
  array(1) {
	["p"]=>
	int(1)
  }
  [3]=>
  array(1) {
	["n"]=>
	int(-3)
  }
  [4]=>
  array(1) {
	["n"]=>
	int(-4)
  }
}

Mas agora, você vai precisar adaptar seu script para que ele ache os valores dentro desse tipo de array.

 

<?php
	echo $cc[0]["n"]; # -1
	echo $cc[1]["n"]; # -2
	echo $cc[2]["n"]; # vazio, porque nesse array não há a chave "n"
	echo $cc[2]["p"]; # 1
?>

Não sei se vai te ajudar. Qualquer coisa, estamos ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Mario.

Isso não antende ao que eu preciso fazer, porém é bom, pois vai me servir para outra coisa.

Vou estudar como resolver o problema de outra maneira.

Valeu pela dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imaginei mesmo que isso não serviria muito para o que você precisa.

Essa associação precisa ser chave=>valor?

E se você criar um Array com esses valores como sendo uma coisa só?

Tipo:

Array ("n|-1", "n|-2", "p|1", "n|-3", "n|-4");
Desse modo, a associação de cada ítem seria pelo separador "|".

E assim, você teria os valores de cada um usando um explode("|") em cada valor do Array.

 

Apenas uma idéia BEM por cima do que poderia ser.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com alguma adaptação acho que até funcionaria em minha aplicação sim.

Isso que eu estava precisando era para usar junto com a lib Smarty. Me facilitaria a vida um pouco. Porém, depois do você comentou sobre o problema das chaves serem iguais, no post anterior, me toquei que teria que dar outra solução para o caso. Sem problema, já resolvi. Só que não ficou tão elegante quanto eu gostaria.

 

obrigado mais uma vez.

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.