Ir para conteúdo

Arquivado

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

matheus.leite

Alterar posição de arrays

Recommended Posts

Boa tarde pessoal !

Sou novo aqui no forum, então se eu postar algo errado me perdoe.

Amigos, sou novo com php e estou tendo problemas em achar uma solução. 

Tenho um array: 

$arrayCarro = array(
				   array(
				   		"Cor"=>$gol->getCor(),
						"Marca"=>$gol->getMarca(),
						"Modelo"=>$gol->getModelo(),
						"Ano"=>$gol->getAno()
				   ),
			 	   array(
			 	   		"Cor"=>$fusca->getCor(),
						"Marca"=>$fusca->getMarca(),
				       "Modelo"=>$fusca->getModelo(),
					    "Ano"=>$fusca->getAno()
				   ),
				   array(
			 	   		"Cor"=>$tg->getCor(),
						"Marca"=>$tg->getMarca(),
					   "Modelo"=>$tg->getModelo(),
					    "Ano"=>$tg->getAno()
				   )
			  );

e eu passo ele para um objeto do tipo 'Corrida', até ai tudo bem. Porém eu tenho uma function chamada 'ultrapassagem' e não faço a menor ideia de como poderia, de fato, fazer essa "ultrapassagem".

Este é o 'index.php':

<?php 
require 'classes/Carro.php';
require 'classes/Corrida.php';
$gol = new Carro();
$fusca = new Carro();
$tg = new Carro();

$gol->setCor("Rosa");
$gol->setMarca("Wolks");
$gol->setAno(2018);
$gol->setModelo("Sedan");

$fusca->setCor("Azul");
$fusca->setMarca("Wolks");
$fusca->setAno(2018);
$fusca->setModelo("4X4");

$tg->setCor("vermelho");
$tg->setMarca("TG sedan");
$tg->setAno(2098);
$tg->setModelo("Flat");


$arrayCarro = array(
				   array(
				   		"Cor"=>$gol->getCor(),
						"Marca"=>$gol->getMarca(),
						"Modelo"=>$gol->getModelo(),
						"Ano"=>$gol->getAno()
				   ),
			 	   array(
			 	   		"Cor"=>$fusca->getCor(),
						"Marca"=>$fusca->getMarca(),
				       "Modelo"=>$fusca->getModelo(),
					    "Ano"=>$fusca->getAno()
				   ),
				   array(
			 	   		"Cor"=>$tg->getCor(),
						"Marca"=>$tg->getMarca(),
					   "Modelo"=>$tg->getModelo(),
					    "Ano"=>$tg->getAno()
				   )
			  );


$corrida = new Corrida($arrayCarro);
$corrida->posicaoCarro();


Esta é a Classe Corrida:

<?php
class Corrida 
{
  
	private $arrayCarros;
	public function __construct($arrayCarros)
	{
		$this->arrayCarros = $arrayCarros;

		if(count($arrayCarros) > 0)
		{
			echo 'A corrida pode começar pois existe mais de um carro !'.PHP_EOL;
		} else {
			echo 'A corrida não pode começar pois existe apenas um carro :('.PHP_EOL;
			exit;
		}
	}
  
	public function iniciarCorrida()
	{
		echo 'Começando a corrida ...'.PHP_EOL;
		echo '1, 2, 3 e JÁ!!.' .PHP_EOL;
		echo '- A corrida começou ! Confira a posição inicial de cada carro: '.PHP_EOL;
		echo PHP_EOL;
		$this->posicaoCarro();

	}

	public function ultrapassagem()
	{
      	/*Aqui eu tentei fazer algo, porem ele apenas retira o último elemento do array
      		e o avança para direita, foi o mais próximo que consegui de uma 'Ultrapassagem'		*/
		$quantidadeCarros = count($this->arrayCarros);
		$auxiliar = $this->arrayCarros[$quantidadeCarros - 1];
		
		for ($i = $quantidadeCarros -1; $i > 0 ; $i--) { 
			$this->arrayCarros[$i] = $this->arrayCarros[$i -1];
		}
		$this->arrayCarros[0] = $auxiliar;
		echo 'Aconteceu uma ultrapassagem'.PHP_EOL;
		print_r($this->arrayCarros);
	}

  //Apenas uma função para 'melhorar' a exibição dos arrays.
	public function posicaoCarro()
	{
        $i = 1;
        foreach ($this->arrayCarros as $key => $value){
            echo 'Posição ['. $i++."] => ";
            print_r("Marca: " . $value['Marca'] . ", ");
            print_r("Modelo: " . $value['Modelo'] . ", ");
            print_r("Ano: " . $value['Ano'] . " ");
	        print_r("Cor: " . $value['Cor'] . " " .PHP_EOL);
	        echo PHP_EOL;
            
        }

    }

OBS: Existem N carros.

Um carro só pode passar o carro que esta na sua frente, por ex: Carro[1] pode  ultrapassar o Carro[0], porém  o Carro [2] não pode ultrapassar o Carro[0], apenas o Carro[1]. Após a ultrapassagem a lista dos carros deve ser reordenada.

 

Alguém poderia me ajudar ? 

Desde já agradeço !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, pode nos postar o seu cenário completo? O objeto Corrida, aonde ele fica armazenado (se é apenas em um array normal), etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 03/09/2018 at 08:55, Gabriel Heming disse:

Olá, pode nos postar o seu cenário completo? O objeto Corrida, aonde ele fica armazenado (se é apenas em um array normal), etc...

Prontinho, perdão! xD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu recomendaria criar um estrutura própria baseada em Data Structure.

 

De qualquer forma, usando apenas o que já existe, pode-se usar a Data Structure Vector ou Deque. Basicamente,  elas são sequencias que podem encolher/aumentar conforme a necessidade (a Deque leva vantagem nos métodos shift e unshif, que no seu caso pode ser usado em apenas um momento). O diferencial nelas serão os métodos insert e find, para alterar a posição entre eles.

$gol->setCor("Rosa");
$gol->setMarca("Wolks");
$gol->setAno(2018);
$gol->setModelo("Sedan");

$fusca->setCor("Azul");
$fusca->setMarca("Wolks");
$fusca->setAno(2018);
$fusca->setModelo("4X4");

$tg->setCor("vermelho");
$tg->setMarca("TG sedan");
$tg->setAno(2098);
$tg->setModelo("Flat");

//Insira diretamente os objetos na lista
// a posição deles assumida é
// 1 - Gol
// 2 - Fusca
// 3 - TG
$list = new \Ds\Deque([$gol , $fusca , $tg]);

Ultrapassagem:

// suponha-se que o tg ultrapasse o fusca

$position = $list->find($tg);

//valida se localizou o veículo
if ($position === false)
{
    // não esperamos esse erro, mas, se ocorrer, já sabe...
    throw new \UnexpectedValueException("Veículo não localizado");
}

if ($position === 0)
{
    // não esperamos esse erro, mas, se ocorrer, já sabe...
    throw new \InvalidArgumentException ("Veículo já é o primeiro colocado");    
}

// Método Ds\Deque::remove() remove o valor e retorna ele.
// O método Ds\Deque::insert() insere o valor na posição indicada, rearranjando a sequencia.
// Posição é sempre n - 1 (ou seja, a primeira é zero).
$list->insert($position - 1 , $list->remove($positon));

O interessante é que você não precisa dizer quem ele está ultrapassando, apenas dizer "qual carro" ultrapassou. O resto é tratado de forma uniforme.

 

Caso você queria que cada carro guarde a sua própria posição, pode usar o método Ds\Deque::apply que aplica uma função em todos os elementos da sequencia.

 

Se quiser ler um pouco mais sobre Data Structures, o seguinte link é do criador da biblioteca: https://medium.com/@rtheunissen/efficient-data-structures-for-php-7-9dda7af674cd

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por First
      Olá a todos!
       
      Quando eu tento fazer o login me mostra esse erro "Could not log you in."; Alguém sabe me ajudar a resolver esse problema no meu código?
      <?php require_once("core/init.php"); if (Input::exists()) { if (Token::check(Input::get("token"))) { $validate = new Validate(); $validation = $validate->check($_POST, array( "username" => array("required" => true), "password" => array("required" => true) )); if ($validation->passed()) { $user = new User(); $remember = (Input::get("remember")) === "on" ? true : false; $login = $user->login(Input::get("username"), Input::get("password"), $remember); if ($login) { Session::flash("home", "Welcome back!"); Redirect::to("index.php"); } else { echo "Could not log you in."; } } else { foreach ($validation->errors() as $error) { echo $error."<BR>"; } } } } ?> <form action="" method="POST"> <div class="field"> <label for="username">Username</label> <input type="text" name="username" id="username"> </div> <div class="field"> <label for="password">Password</label> <input type="password" name="password" id="password"> </div> <div class="field"> <label for="remember"> <input type="checkbox" name="remember" id="remember"> Remember me </label> </div> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <input type="submit" value="Log in"> </form>  
       
      Desde já obrigado.
×

Informação importante

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