funkcja array_unique działa niewłaściwie

0

Mam taki problem mam tablice dwuwymiarową i dla taki wartości

array(7) { [0]=> array(2) { [0]=> int(2) [1]=> int(1500) } [1]=> array(2) { [0]=> int(3) [1]=> int(1200) } [2]=> array(2) { [0]=> int(2) [1]=> int(1500) } [3]=> array(2) { [0]=> int(4) [1]=> int(600) } [4]=> array(2) { [0]=> int(2) [1]=> int(1500) } [5]=> array(2) { [0]=> int(3) [1]=> int(1200) } [6]=> array(2) { [0]=> NULL [1]=> int(0) } }

Ta funkcja zwraca tylko jedną wartość, a mianowicie tą

array(1) { [0]=> array(2) { [0]=> int(2) [1]=> int(1500) } }

A powinna zwrócić niepowtarzające się elementy.
Chodzi o to, żeby usuwała powtarzające się elementy tylko z 1 elemtu tablicy.
czyli ta rtablica po prztworzeniu miała by wyglądać tak

array(7) { [0]=> array(2) { [0]=> int(2) [1]=> int(1500) } [1]=> array(2) { [0]=> int(3) [1]=> int(1200) } [3]=> array(2) { [0]=> int(4) [1]=> int(600)   [6]=> array(2) { [0]=> NULL [1]=> int(0) } }

Tu daje kod źródłowy

  public function sortuj_substancje($tablica) {
    $tymczasowa = array();
    $nowa_tablica = array();
    $k = 0;
    $z = 0;
    for ($i=0;$i<= count($tablica);$i++) {
      $tymczasowa[0][0] = $tablica[$i][0];
      $tymczasowa[0][1] = $tablica[$i][1];
      //$nowa_tablica[$i][0] = $tablica[$i][0];
      //$nowa_tablica[$i][1] = $tablica[$i][1];
      for ($j=0;$j <= count($tablica);$j++) {
	if ($tablica[$i][0] == $tablica[$j][0]) {
	  $nowa_tablica[$k][0] = $tablica[$i][0];
	  $nowa_tablica[$k][1] += $tablica[$j][1];
//	  print $tablica[$j][1] . "<br>";
	  //$k++;
	}

      }
    $k++;
    }
    
    return $nowa_tablica;
    
  }
$ta[0][0] = 2;
$ta[0][1] = 300;
$ta[1][0] = 3;
$ta[1][1] = 400;
$ta[2][0] = 2;
$ta[2][1] = 500;
$ta[3][0] = 4;
$ta[3][1] = 600;
$ta[4][0] = 2;
$ta[4][1] = 700;
$ta[5][0] = 3;
$ta[5][1] = 800;
$a = $substancja->sortuj_substancje($ta);
$a = array_unique($a);
var_dump($a);
0

http://php.net/manual/en/function.array-unique.php array_unique nie działa na tablicach wielowymiarowych "Note: Note that array_unique() is not intended to work on multi dimensional arrays."

W komentarzach na php.net można znaleźć rozwiązanie

function super_unique($array)
{
  $result = array_map("unserialize", array_unique(array_map("serialize", $array)));

  foreach ($result as $key => $value)
  {
    if ( is_array($value) )
    {
      $result[$key] = super_unique($value);
    }
  }

  return $result;
}

https://eval.in/568098 - tutaj wynik jest taki jak oczekujesz

0

Działa, ale do pewnego momentu, usuwa powtarzające się elementy tylko w warunku kiedy dwie wartości w tablicy będą takie same, a jak przykładowo będzie taka tablica

$ta[0][0] = 1;
$ta[0][1] = 100;

$ta[1][0] = 2;
$ta[1][1] = 200;

$ta[2][0] = 1;
$ta[2][1] = 300;

W tym wypadku też chciałbym, żeby usuwała takie same wartości.

0

Niestety chyba nie rozumiem. :(

U mnie dla wejściowej tablicy $ta z wartościami, które podałeś w powyższym poście są takie wyniki:


print_r($ta); 
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 100
        )

    [1] => Array
        (
            [0] => 2
            [1] => 200
        )

    [2] => Array
        (
            [0] => 1
            [1] => 300
        )

)

$a = sortuj_substancje($ta);
print_r($a); 
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 400
        )

    [1] => Array
        (
            [0] => 2
            [1] => 200
        )

    [2] => Array
        (
            [0] => 1
            [1] => 400
        )

    [3] => Array
        (
            [0] => 
            [1] => 0
        )

)

$b = super_unique($a);
print_r($b); 
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 400
        )

    [1] => Array
        (
            [0] => 2
            [1] => 200
        )

    [3] => Array
        (
            [0] => 
            [1] => 0
        )

)

Zostały usunięte powtarzające się wartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1