Array cu toate numerele unice

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
assus
Mesaje:3

Array cu toate numerele unice

Multe informatii din limbajul php le-am cules de pe acest site. Nu ma consider un guru in acest limbaj si de aceea apelez la cunostiintele voastre (in special ale lui MarPlo).
Am urmatorul cod:

Cod: Selectaţi tot

function alteNumere() {
$conect = dbC();
// ...............
$var = $_POST['_var'];
}
$Mysql = "SELECT * FROM sortare WHERE numar = $numar ORDER BY index ASC LIMIT 0," . $maxim . "";
@$date = mysql_query($Mysql, $conect);
$num = mysql_num_rows($date);
// .............
$i = 0;
while ($row = mysql_fetch_assoc($date)) {
$index[$i] = $row["index"];
$n1[$i] = $row["nr1"];
$n2[$i] = $row["nr2"];
$n3[$i] = $row["nr3"]
$n4[$i] = $row["nr4"];
$i++;
}
$sortare = '';
if ($var > $num)
return;
$sortare .= '<tr>';
$sortare .= '<td>1</td>';
$sortare .= '<td>' . $n1[$var] . '</td><td>' . $n2[$var] . '</td><td>' . $n3[$var] . '</td><td>' . $n4[$var] . '</td>';
$sortare .= '</tr>';
//-----------------------------
$count = 2;
for ($i = 1; $i < $num; $i++) {
 $a = array($n1[$var], $n2[$var], $n3[$var], $n4[$var], $n5[$var], $n6[$var]);
$b = array($n1[$var + $i], $n2[$var + $i], $n3[$var + $i], $n4[$var + $i]);
if (!array_intersect($b, $a)) {
$sortare .= '<tr>';
$sortare .= '<td>' . $count . '</td>';
$sortare .= '<td>' . $b[0] . '</td><td>' . $b[1] . '</td><td>' . $b[2] . '</td><td>' . $b[3] . '</td>';
$sortare .= '</tr>';
$count++;
}
}
//-----------------------------
dbD($conect);
return $sortare;
}
$number = alteNumere();
echo "$number";
Codul executa verificarea celorlalte array sa nu fie identice cu primul array...
Daca imi poti da o idee MarPlo sau celorlalti useri cum as putea sa verific ca si celelalte array rezultate sa se verifice cu primul array din celelalte array!?
Ex:
Avem numere pana la 1000 cu 5 array: arr1 = [1,10,21,23]; arr2= [100,210,220,300]; arr3 = [1,200,220,500]; arr4 = [150, 200, 320,500]; arr5 = [150,400,500,600]
Rezolvare:
// compara arr1 cu arr2, arr3, arr4, arr5 sa aiba toate numerele unice si-l afisam
arr1
1. arr2
2. arr4
3. arr5
// compara arr2 cu arr4 si arr5 sa aiba toate numerele unice si-l afisam
arr2
1.arr4
2. arr5
// compara arr4 cu arr5 sa aiba numerele unice si-l afisam
arr4
1. 0
Rezultat: arr1, arr2, arr4
Ma poate ajuta cineva?

MarPlo Mesaje:4343
Salut
Nu prea am inteles exact intrebarea. Vrei sa scoti numerele unice din mai multe array-uri? Cand compari un array cu alte doua, sa rezulte un alt array cu numerele unice din ele, sau sa gaseasca array-ul din cele doua care nu are numere ca cele din array-ul comparat?

assus Mesaje:3
Imi cer scuze pentru neintelegerea algoritmului...
Exemplific:
Presupunem ca avem 100 numere cu 5 array a cate 2 numere fiecare, adica
1. arr1 = [2,6];
2. arr2 = [4,10];
3. arr3 = [2, 12];
4. arr4 = [50, 63];
5. arr5 = [45, 50].
Scriem primul array: arr1
-Comparam ultimele 4 array cu primul array arr1 (pentru unicitate), astfel:
1. arr2 != arr1; arr3 != arr1; arr4 != arr1; arr5 != arr1 rezulta
2. arr2 ramane (nu are nici un element comun cu arr1); arr3 nu ramane (are 1 element comun cu arr1 - 2); arr4 ramane; arr5 ramane.
Rezultat: arr2, arr4, arr5.
Din acest rezultat pastram pe arr2 (fiind primul din rezultatul arr2, arr4, arr5).
-Comparam celelalte array rezultate cu arr2, astfel
1. arr4 != arr2; arr5 != arr2 rezulta
2. arr4 ramane(nu are nici un element comun cu arr2); arr5 ramane (nu are nici un element comun cu arr2).
Rezultat: arr4, arr5.
Din acest rezultat pastram pe arr4 (fiind primul din rezultatul arr4, arr5).
-Comparam celelalte array rezultate cu arr4, astfel
1. arr5 != arr4 rezulta
2. arr5 nu ramane (are 1 element comun cu arr4 - 50).
Rezultat: 0
AFISARE: arr1, arr2, arr4.
Sper sa fie inteles algoritmul... Multumesc oricum pentru promptitudinea raspunsului.

MarPlo Mesaje:4343
Vezi daca te ajuta functia din acest exemplu (array-urile cu numere trebuie adaugate intr-un array).

Cod: Selectaţi tot

// recursive function that returns an array with the array-keys with unique numbers
// receives: $arc (array to compare), $arr (two-level array with numbers to compare), $re (array with returned result)
function getUniqueNr($arc, $arr, $re) {
  // https://coursesweb.net/php-mysql/
  if(count($arr) > 0) {
    $x = 0;
    foreach($arr AS $k=>$arv) {
      if(!array_intersect($arc, $arv)) {
        if($x == 0) {
          $next_arc = $arv;
          $re[] = $k;      // to return the key of the array with numbers
     //   $re[] = $next_arc;      // to return the array with numbers
          $x = 1;
        }
      }
      else unset($arr[$k]);
    }
    if(count($arr) > 1 && isset($next_arc)) {
      array_shift($arr);
      return getUniqueNr($next_arc, $arr, $re);
    }
    else return $re;
  }
}

// two-level array with numers
$arr = array(
  'arr1' => array(2, 6),
  'arr2' => array(4, 10),
  'arr3' => array(2, 12),
  'arr4' => array(50, 63),
 'arr5' => array(45, 50)
);

$unique_nrs = getUniqueNr($arr['arr1'], $arr, array('arr1'));

// test
var_export($unique_nrs);        // array (0=>'arr1', 1=>'arr2', 2=>'arr4')

assus Mesaje:3
Multumesc pentru script. Respecta intocmai algoritmul cerut...
Si eu ma gandeam la metoda recursiva (sau metoda Backtracking - cautare cu revenire) insa din cate stiu, daca nu te pricepi e mai buna o alta solutie...
Stiam ca-mi vei rezolva problema, de-altfel ti-am citit aproape toate exemplele de pe acest site...
Multumesc inca o data MarPlo, si la cat mai multe rezolvari reusite.

Mai am o mica problema!?
Am introdus apelul functie getUniqueNr() intr-un ciclu for cu $unique_nrs[$i] si-mi afiseaza corect keyle.
Prin modificarea comentariilor facute de tine pentru key si valori

Cod: Selectaţi tot

// $re[] = $k;    // to return the key of the array with numbers
$re[] = $next_arc;    // to return the array with numbers     
am scris functia implode() pentru afisare

Cod: Selectaţi tot

echo ''.implode(", ", $unique_nrs[$i]).'<br>' ;  
in afara primului array - arr1 (cu valorile sale) toate sunt corect afisate...
Am gresit utilizand functia implode() sau am omis ceva de nu-mi afiseaza primul array!?

Multumesc anticipat

MarPlo Mesaje:4343
Probabil ca ai omis sa treci primul array cu valori in argumentul array pentru al treilea parametru, $re.
Vezi daca iti e de folos varianta de la pagina: Get all the unique numbers from two-dimensional array, necesita doar un singur argument, array-ul cu numere.

Subiecte similare