Ir para conteúdo

POWERED BY:

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 violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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