Ir para conteúdo

Arquivado

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

ifspinit

Função para ler string e criar array com as combinações possíveis substituindo determinados elementos

Recommended Posts

Olá, sou iniciante em PHP. Estou com um problema na resolução de um exercício. Devo ler uma string que faça a substituição de determinados caracteres por números, criando um array com as combinações possíveis.

 

As regras são de substituição são:

X - Qualquer número de 0 a 9

Y -  Pode ser 1 ou 2

Z -  Qualquer número de 5 a 9

 

Por exemplo:

Entrada : X123

Saída: 0123, 1123, 2123, 3123, 4123, 5123, 6123, 7123, 8123, 9123

 

Entrada: Y12

Saída: 112, 212

 

Entrada: Y12Z

Saída: 1125, 2125, 1126, 2126, 1127, 2127, 1128, 2128, 1129, 2129

 

Entrada: XX

Saída: 00, 10, 20, 30, 40, 50, 60, 70, 80, 90, 01, 11, 21, 31, 41, 51, 61, 71, 81, 91, 02, 12, 32, 42, 52, 62, 72, 82, 92, etc...  

 

 

Fiz o código monstrouso abaixo onde verifica

se tem x, y e z;

se tem x e y;

se tem x e z;

se tem y e z;

se tem somente x;

se tem somente y;

se tem somente z.

 

 

<php?
$verif = strstr($str, "x");
$verif2 = strstr($str, "y");
$verif3 = strstr($str, "z");

if($verif and $verif2 and $verif3){
	for ($k=1; $k<=2; $k++){	
		for ($j=5; $j<=9; $j++){
			for ($i = 0; $i <= 9; $i++){
				$teste = str_replace("x", "$i", $str);
				$teste2= str_replace("z", "$j", $teste);
				$teste3 = str_replace("y", "$k", $teste2);
				array_push($meuarray, $teste3);
			}
		}
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}

else if($verif and $verif2){
	for ($j=1; $j<=2; $j++){
		for ($i = 0; $i <= 9; $i++){
			$teste = str_replace("x", "$i", $str);
			$teste2 = str_replace("y", "$j", $teste);
			array_push($meuarray, $teste2);
		}
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}

else if($verif and $verif3){
	for ($j = 5; $j <= 9; $j++){
		for ($i = 0; $i <= 9; $i++){
			$teste = str_replace("x", "$i", $str);
			$teste2 = str_replace("z", "$j", $teste);
			array_push($meuarray, $teste2);
		}
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}

else if($verif2 and $verif3){
	for ($j = 1; $j <= 2; $j++){
		for ($i = 5; $i <= 9; $i++){
			$teste = str_replace("y", "$i", $str);
			$teste2 = str_replace("z", "$j", $teste);
			array_push($meuarray, $teste2);
		}
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}

else if($verif){
	for ($i = 0; $i <= 9; $i++){
		$teste = str_replace("x", "$i", $str);
		array_push($meuarray, $teste);
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}


else if($verif2){
	for ($i = 1; $i <= 2; $i++){
		$teste = str_replace("y", "$i", $str);
		array_push($meuarray, $teste);
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}


else if($verif3){
	for ($i = 5; $i <= 9; $i++){
		$teste = str_replace("z", "$i", $str);
		array_push($meuarray, $teste);
	}
	$arrayfinal = implode(",", $meuarray);
	echo $arrayfinal;
}
?>

 

Funciona para quando tiver apenas um caso de cada. Mas se houver dois x, três x, etc, não funcionará. Alguém poderia me ajudar?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que fica mais fácil se você fazer o "parse" por etapas e usando funções. Você acaba realizando um esforço tremendo para analisar se a string possui um determinado caracter ou não, mas, isso é irrelevante do ponto de vista de processamento.

 

Vou deixar aqui a lógica para apenas um deles, veja o código em funcionamento e entenda como foi realizado:

function parseX($string)
{
    $array = is_string($string) ? str_split($string) : $string;
    
    if (!in_array("X" , $array))
    {
        return [$string];
    }
    
    $ret = [];
    $key = array_search('X' , $array);
    
    for($i = 0 ; $i < 10; $i++)
    {
        $array[$key] = $i;
        $ret = array_merge($ret , parseX(implode('' , $array)));
    }
    
    return $ret;
}

Eu acabo transformando para a array, para resolver de forma "mais fácil" o problema que o str_replace gera, que é substituir todos os caracteres ao mesmo tempo.

 

A recursividade é utilizada para que subsitua um caracter por vez, até que não haja mais nenhum para ser substituído.

 

O código em si é simples, e ainda pode ser simplificado, mantendo apenas uma função.

 

Codigo em funcionamento: https://3v4l.org/WuGsi

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, muito obrigado. Deu uma luz. Mas estou tendo problemas para junção em analisar se tem Y e Z na mesma array. Faltando lógica e experiência para mim. haha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como está seu código agora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não está, tentei fazer a junção de diferentes modos para substituir x e y também. Somente o que você me passou está funcional. 

 

Tentei passar o resultado da função x em uma função y, convertando pra string, separando em um array constando elemento por elemento. Não vai

 

<?php

function parsex($string)
{
	$array = str_split($string);
	if (!in_array("X" , $array))
    {
		return [$string];
    }
    
	$ret = [];
	$key = array_search('X' , $array);
    
	for($i = 0 ; $i <= 9; $i++)
    {
		$array[$key] = $i;
		$ret = array_merge($ret , parsex(implode('' , $array)));
    }
    
    return $ret;
}


function parsey($array)
{
	$array2 = str_split(implode("", ($array)));
	if (!in_array("Y" , $array2))
    {
		return $array;
    }
	$ret = []; 
	$key = array_search('Y' , $array2);
	for($i = 1 ; $i <= 2; $i++)
    {
		$array2[$key] = $i; 
		$ret = array_merge($ret , parsey(implode('' , $array2)));
    }
    return implode("",$ret);
}
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não pode juntar as strings do array com implode para tratar elas, isso não irá funcionar. Deve tratar cada string separadamente.

 

Se você esta recebendo um array, itere sobre ele:

$arrayX = parseX($sring)

$arrayY = [];

foreach($arrayX as $val)
{
    $arrayY = array_merge($arrayY , parseY($val));
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por Carlos Web Soluções Web
      Olá...
      Estou tentando fazer o seguinte !!
      Listando dados em tabela !!
      Gostaria que....se na listagem houver 4 linhas...indepedente de seu número de ID, faça a listagem em ID ser em ordem 1 2 3 4 !!
      Exemplo...se tiver uma listagem de dados que está em ID 1 3 3...faça ficar 1 2 3 !!

       
      echo "<table class='tabela_dados' border='1'> <tr> <td>ID</td> <td>Nome Empresa</td> <td>Responsável</td> <td>Telefone 1</td> <td>Telefone 2</td> <td>E-mail 1</td> <td>E-mail 2</td> <td>Endereço</td> <td>CEP</td> <td>Bairro</td> <td>AÇÃO 1</td> <td>AÇÃO 2</td> </tr> "; $sql = "SELECT ID FROM usuarios_dados WHERE Usuario='$usuario'"; $result = $conn->query($sql); $num_rows = $result->num_rows; $Novo_ID = 1; for ($i = 0; $i < $num_rows; $i++) { $registro = $result -> fetch_row(); $sql2 = "UPDATE usuarios_dados SET ID='$Novo_ID' WHERE ID='$Novo_ID'"; $result2 = $conn->query($sql2); $Novo_ID++; } $sql = "SELECT * FROM usuarios_dados"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr> <td>$row[ID]</td> <td>$row[Nome_Empresa]</td> <td>$row[Responsavel]</td> <td>$row[Telefone_1]</td> <td>$row[Telefone_2]</td> <td>$row[Email_1]</td> <td>$row[Email_2]</td> <td>$row[Endereço]</td> <td>$row[CEP]</td> <td>$row[Bairro]</td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> "; } } else { echo "0 results"; } $conn->close();  
    • Por ILR master
      Boa tarde pessoal, tudo bem ?
       
      Eu uso o tinymce para cadastro de textos no meu siite, porém, quero fazer um sistema para que os colunistas possam fazer o próprio post.
      O problema do tinymce, é que ele mantém a formatação do texto copiado, como tamanho de fonts, negritos, etc... Quero que o usuário cole o texto e a própria textarea limpe a formatação para que ele formate como quiser.
       
      A pergunta é:
       
      O tinymce tem uma opção para desabilitar a formatação quando um texto é colocado?
      Tem alguma função via java ou php para retirar a formatação assim que o texto é colado?
      Ou é melhor usar um outro editor?
       
      Agradeço deste já.
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
×

Informação importante

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