Ir para conteúdo
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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Claudia França
      Pessoal escrevi o código,  (  <style id=”antiClickjack”>body{display:important;}</style>
      <script type=”text/javascript”>
      if (self === top) {
      var antiClickjack = document.getElementById(“antiClickjack”);
      antiClickjack.parentNode.removeChild(antiClickjack);
      } else {
      top.location = self.location;
      }
      </script> ) em um site o head por exigência da empresa de cartão, mas tenho percebido que com um tempo o site para de acionar o java script para carregar outra pagina.  Isso aconteceu depois desse código. Eu tenho que escrever algo no corpo no site para isso nao mais acontecer e deixar o anticlick habilitado. ?
    • Por Mark Augusto
      Faço a chamada e executo o código, mas não sei como dar um laço nas datas
      setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese"); date_default_timezone_set('America/Sao_Paulo'); $date = date("m/y"); $nu = 0; $rating = $conexaoDB->query("SELECT * FROM calendar ORDER BY id ASC LIMIT 20"); while($star = $rating->fetch_array()){ $id_c = $star['id-post']; $critics = $conexaoDB->query("SELECT * FROM postagens WHERE id_post='$id_c' AND online='calendar'"); $cri = $critics->fetch_assoc(); $editorCric = $cri["id_editor"]; $idPostCric = $cri["id_post"]; $date1 = explode("/", $star["data"]); $reconf_data = $date1[1]."/".$date1[2]; $nu = $nu+1; chamei apenas o mês e o ano e agrupei com o mês e ano do array... mas não tem dado resultado, então fiz uma gabiarra provisória  para ordenar por id. 
    • Por Solo
      Boa noite  pessoal, estou com um problema, sou iniciante me php e estou em duvida com como posso fazer uma paginacao de produtos do banco de dados...... alguem poderia me ajudar ou me indicar um tutorial ???
       
      <?php
      error_reporting(0);
      ini_set(“display_errors”, 0 );
      require_once("conexao.php"); 
         $produtos = "SELECT produto_ID, nome_produto, imagem_produto, valor ";
          $produtos .= "FROM produto ";
          $resultado = mysqli_query($conecta, $produtos);
          if(!$resultado) {
              die("Falha na consulta ao banco");   
          }
      ?> 
       
       
       
      AONDE LISTA OS PRODUTOS 
       
       
       
          <div class="rowproducts">
          <div id="listagem_produtos2" class="">
            <?php while($linha=mysqli_fetch_assoc($resultado)) {   ?>
                       
                      <ul>
                          <div class="class22">
                          
                          <li>
                              
                              <img  class="img-responsive"  height="200" width="200" src="<?php echo $linha["imagem_produto"]?> "  >
                              </li>
                              
                              <li class="nproduto"><?php echo $linha["nome_produto"]?></li>
                               <li class="nproduto">R$ <?php echo $linha["valor"]?></li>
                          </div>
                          </ul>
                          
                          
                          
                          
                          
                          
                          
                      
                  <?php } ?>
                      
                      
                      
                    </div>
                    </div>
       
       
       
       
    • Por RooseveltDorea
      Bom dia a todos!
       
      Antes de vir para o fórum pesquisei quebrei a cabeça e mesmo assim não consegui. Então peço ajuda.
       
      Tenho uma aplicação, php com access, rodando perfeitamente em ambiente windows na redehost: sistescom.com.br/fc
       
      Qual o problema?
      Instalei o php 7 na minha máquina baixei a minha aplicação e vejam o resultado:
       
      ---
      Fatal error: Uncaught Error: Class 'COM' not found in C:\Apache24\htdocs\fc\connections\ADOConnection.php:41 Stack trace: #0 C:\Apache24\htdocs\fc\connections\Connection.php(54): ADOConnection->connect() #1 C:\Apache24\htdocs\fc\connections\ADOConnection.php(18): Connection->__construct(Array) #2 C:\Apache24\htdocs\fc\connections\ConnectionManager.php(224): ADOConnection->__construct(Array) #3 C:\Apache24\htdocs\fc\connections\ConnectionManager.php(84): ConnectionManager->getConnection('FichadeChamada_...') #4 C:\Apache24\htdocs\fc\connections\ConnectionManager.php(95): ConnectionManager->byId('FichadeChamada_...') #5 C:\Apache24\htdocs\fc\include\appsettings.php(697): ConnectionManager->getDefault() #6 C:\Apache24\htdocs\fc\include\dbcommon.php(90): include('C:\\Apache24\\htd...') #7 C:\Apache24\htdocs\fc\login.php(5): require_once('C:\\Apache24\\htd...') #8 {main} thrown in C:\Apache24\htdocs\fc\connections\ADOConnection.php on line 41
      ---
      Estou usando o phprunner para gerar minha aplicação.
      Não sou programador, estou aprendento PHP aos poucos.
       
      Muito obrigado a todos.
       
      Júnior
    • Por JeysonRomualdo
      <?php //conexão com banco de dados.   $pdo = new PDO("mysql:dbname=cadastro", "root", "");   ?>   <html> <head> <title>Autenticando Usuario</title> <script type="text/javascript"> function loginsussesfully() { setTimeout("window.location='painel.php'", 5000); } function loginfailed(){ setTimeout("window.location='login.php'", 5000); } </script> </head> <body>   <?php //capturando informaçoes digitadas pelo usuario $email = $_POST['email']; $senha = $_POST['senha']; $sql = "SELECT * FROM usuarios WHERE email = '$email' and senha = '$senha'"; $row = mysql_num_rows($sql); if ($row > 0) { session_start(); $SESSION['email'] = $_POST['email']; $SESSION['senha'] = $_POST['senha']; echo "<center>Você foi autenticado com susseco!</center>"; echo "<script>loginsuccesfully</script>"; } else{ echo "<center>Nome de usuario ou senha invalidos!</center>"; echo "<script>loginfailed</script>"; } ?>   </body>   </html> erro na linha 25... nao consigo identificar o que pode estar errado ou faltando
×

Informação importante

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