Ir para conteúdo

POWERED BY:

Arquivado

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

Edgard Lopes

[Resolvido] Como resgatar "algumas" variáveis de um array

Recommended Posts

Pessoal, MUITO Obrigado à todos vocês! Vocês foram rápidos e mostraram idéias diferentes. Ajudaram-me muito. Como sou principiante, não serei tão rápido para adaptar as soluções que vocês encontraram para o problema que eu tenho. Eu postei uma parte dele. Mas o restante já existe solução, só dependia disso para fazer o restante funcionar...

 

O que estou fazendo é calcular Horas Extras dos funcionários que trabalham 44h semanais. Porém, esses funcionários não trabalham por semana, mas sim, por dias aleatórios, os quais, somando, dão 44h semanais. Eles podem trabalhar de quarta-feira à segunda-feira ou de quinta-feira à terça-feira... assim por diante. E para complicar, no mesmo sistema, existem funcionários na escala 4x2, 3x1, 12x36, etc... (Esses eu consegui solucionar).

 

Assim que eu terminar essa parte eu posto toda a estrutura lógica de cálculo de horas, dessas escalas de trabalho. Mais uma vez, obrigado.

 

Percebi que houveram alguns conflitos sobre os valores que se repetem. Eu exemplifiquei com o "F", mas disse que existem apenas 2 tipos que se repetem. O "F" e o "IN" (que está fora do exemplo). Esses valores são fixos. Apenas esses repetem. Porém, pode existir um ou outro, ou os dois.

Desculpem-me pela falta de clareza. Até breve!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois então Edgard, esse era o objetivo, eu achei que podia se repetir com oito valores, por exemplo .. dei um alterada no meu código, postei uma outra situação, na qual o mesmo resolve, no caso de ter 'valores repetidos' entre valores repetidos entre valores não repetidos, como [ I , J , H , I , D , H , X , D , B ] . Perceba essa situação, você teria I entre o H ( que se repete ) D entre o H que se repete , I entre D e H ( que se repetem ), e X ( Que não se repete ) entre H e D ( que se repetem ), não devemos esquecer de agradecer o William Bruno, que fez o fornecimento da matemática nesse tópico !

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois então Edgard, esse era o objetivo, eu achei que podia se repetir com oito valores, por exemplo .. dei um alterada no meu código, postei uma outra situação, na qual o mesmo resolve, no caso de ter 'valores repetidos' entre valores repetidos entre valores não repetidos, como [ I , J , H , I , D , H , X , D , B ].

;)

Obrigado Andrey! Valeu pela força! Sua idéia, também ajudará no restante do trabalho que tenho pela frente.

Ah, sou especialista em Design 3D, PHP é meu novo interesse. Caso você precisa algo relacionado a essa minha especialidade, estamos aí!

Compartilhar este post


Link para o post
Compartilhar em outros sites
existem apenas 2 tipos que se repetem. O "F" e o "IN" (que está fora do exemplo). Esses valores são fixos. Apenas esses repetem. Porém, pode existir um ou outro, ou os dois.

muito bom! isso simplifica e muito a questão.

 

E como seria a saida caso houvesse tanto IN como F na entrada ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como seria a saida caso houvesse tanto IN como F na entrada ?

 

 

Então William, a saída seria com array, agrupando os valores entre IN e IN, IN e F, F e IN, F e F, e o que estiver depois do último F ou IN e também os primeiros valores que antecipam "F" ou "IN". (E deixar esses fora do array). Exemplo:

$produtos=("Ab", "DCn", "QG", "IN", "AP", "TF", "FT", "F", "Md", "CD", "F", "RD", "TL");
$retorna[0]=("Ab", "DCn", "QG");
$retorna[1]=("AP", "TF", "FT");
$retorna[2]=("Md", "CD");
$retorna[3]=("RD", "TL");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Okay, então temos novas premissas, e agora sim, uma idéia clara de como deve ser a saída.

 

 

<?php

       $produtos = Array("Ab", "DCn", "QG", "IN", "AP", "TF", "FT", "F", "Md", "CD", "F", "RD", "TL");

       $out = Array();
       for( $i=0, $j=0, $count=count($produtos); $i<$count; $i++ )
       {
               if( $produtos[$i]=='IN' || $produtos[$i]=='F' )
                       $j++;
               else
                       $out[ $j ][] = $produtos[$i];
       }
       echo '<pre>';
       var_dump( $out );

 

https://ideone.com/7yO3I

array(4) {
 [0]=>
 array(3) {
   [0]=>
   string(2) "Ab"
   [1]=>
   string(3) "DCn"
   [2]=>
   string(2) "QG"
 }
 [1]=>
 array(3) {
   [0]=>
   string(2) "AP"
   [1]=>
   string(2) "TF"
   [2]=>
   string(2) "FT"
 }
 [2]=>
 array(2) {
   [0]=>
   string(2) "Md"
   [1]=>
   string(2) "CD"
 }
 [3]=>
 array(2) {
   [0]=>
   string(2) "RD"
   [1]=>
   string(2) "TL"
 }
}

 

Isso eu chamo de simples :lol:

Get Real galera.. menos funcionalidades, e mais objetividade. Resolvam oque foi proposto, e não oque você acha que foi.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito Obrigado William, sua solução caiu como uma luva.

Mas, uma funcionalidade muito interessante que eu não conhecia é o "preg_split()". Vai ser útil em outras situações...Valeu Bruno Augusto!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, não sei se o meu faz o que o desafio pede, só para brincar (JS, porque PHP tem muita função mágica...):

 

 

var list = ['F' , 'Ab' , 'Dg' , 'Gt' , 'F' , 'Nd' , 'MF' , 'Op' , 'KJ' , 'F' , 'DD' , 'Dj' , 'DD' , 'I' , 'H' , 'J' , 'I' , 'H' , 'Z' , 'H'];

function getArrayDuplicates ( arr ) {
   var v, freqs = {};
   for (var i = arr.length; i--;) { 
       v = arr[i];
	freqs[v] = freqs[v] ? freqs[v] += 1 : freqs[v] = 1;
   }
   return freqs;
}

var foundIndex = 0;
var repeatedTimes = 0;
var repeatedCount = getArrayDuplicates( list );
var newArray = [];

for (var i = 1, il = list.length; i < il; i++) {

if ( list[i] == list[foundIndex] ) {

	newArray.push( list.slice( ++foundIndex, i ) );
	repeatedTimes++;
	foundIndex = i;

	if ( repeatedTimes == (repeatedCount[list[i]] - 1) ) {

		foundIndex = ++i;
		repeatedTimes = 0;

	}

}

}

// final debug
for ( var x in newArray ) {
console.log( newArray[x].toString() );
}

Resultado:

 

Ab,Dg,Gt
Nd,MF,Op,KJ
Dj
H,J
Z

A diferença do código do Andrey é que o meu pegou H, J, pois o delimitador foi pulado, não sei se era para fazer isso... mas valeu =]

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.