jak zmerdżować tablice ignorując zdublowane klucze ?

0

mam takie tablice przyładowe:

$array1 = array('1' => 1, '2' => 2, '3' => 1, '4' => 1);
$array2 = array('4' => 2, '5' => 2, '6' => 1);

i chciałbym uzyskać taki wynik

Array
(
    [1] => 1
    [2] => 2
    [3] => 1
    [4] => 1
    [5] => 2
    [6] => 1
)

Tak na prawdę nie interesują mnie wartości kluczy czyli jak index 4 ma wartość w jednej tablicy 1 a w drugiej 2 to nie ma to znaczenia. Chodzi tylko o to by policzyć ile jest unikalnych kluczy ? Jest jakaś funkcja, która po podaniu tablic dałaby wynik, z powyższego = 6 (tyle jest unikalnych elementów tablicy)

1
UglyMan napisał(a):

tak z google https://www.php.net/manual/en/function.array-merge.php

to nie dziala bo robi index od 0 ale za to zadziałało z tej strony idealnie to:

$array1 = array('1' => 1, '2' => 2, '3' => 1, '4' => 1);
$array2 = array('4' => 2, '5' => 2, '6' => 1);

$array1 + array2 

Dzieki

1

No bo numerowanie powinno się zawsze od 0 zaczynać, czemu ma niby zaczynać się od 1?

0
serek napisał(a):

No bo numerowanie powinno się zawsze od 0 zaczynać, czemu ma niby zaczynać się od 1?

Chodzi o to ze jak mam 10 tablic a chce sprawdzic i zostawic tylko unikalne numery kluczy to jak zlacze pierwsze dwie tablice to dostane index od 0, wiec nie mam jak sprawdzic pozostalych 8 tablic bo juz w tych dwoch klucze zostaly zmienione, dlatego klucze musza pozostac niezmienne.

3

A zwykle array_meege_recursive nie działa w taki sposób?

2

a może?

var_dump(array_unique(array_merge(array_keys($array1), array_keys($array2))));
1
chomikowski napisał(a):
serek napisał(a):

No bo numerowanie powinno się zawsze od 0 zaczynać, czemu ma niby zaczynać się od 1?

Chodzi o to ze jak mam 10 tablic a chce sprawdzic i zostawic tylko unikalne numery kluczy to jak zlacze pierwsze dwie tablice to dostane index od 0, wiec nie mam jak sprawdzic pozostalych 8 tablic bo juz w tych dwoch klucze zostaly zmienione, dlatego klucze musza pozostac niezmienne.

No to jeśli masz wiele tablic, to zrób tak:

$tablica = [$array1, $array2, $array3, $array4, ...];

$unique = array_unique(array_merge(...array_map('array_keys', $tablica)));

$unique;        // tutaj wartościami są tylko unikalne klucze
count($unique); // ilość unikalnych kluczy

Zakładając że mówiąc "unikalne", masz na myśli policzenie ich bez duplikatów? Czy może chodziło Ci faktycznie o to żeby usunąć duplikaty, i policzyć te które faktycznie są unikalne (czyli tych których jest dokładnie 1)?

0

Dziękuje, z [] + [] też działa ale z użyciem funkcji jakoś więcej pewności że będzie ok. Dlatego użyłem waszych sugestii, :) mega

2
chomikowski napisał(a):

Dziękuje, z [] + [] też działa ale z użyciem funkcji jakoś więcej pewności że będzie ok. Dlatego użyłem waszych sugestii, :) mega

Pamiętaj że używając funkcji array_merge(), array_values(), array_map() korzystasz z implementacji arrayów z C, a pisząc swoje for'y i funkcje, działasz na PHP. W skrócie, jeśli korzystasz z funkcji, to możesz użyć kompilowanych rozwiązań, które są szybciutkie.

1

a gdzie masz ten for? odnosisz się do wypowiedzi że + działa

@Miang: O czym Ty w ogóle mówisz?

W mojej wypowiedzi wyżej chodziło o to, że taki kod korzysta z implementacji w C, przez co jest znacznie wydajniejszy.

$values = array_values($array); // array_values jest zaimplementowana w C, w corze PHP

natomiast taki for w PHP, działa w runtime'ie, przez co jest znacznie mniej wydajny niż implementacja w C.

$values = [];
foreach ($array as $value) { // kopiowanie arraya w runtimie PHP
  $values[] = $value;
}

Dokładnie to napisałem

TomRiddle napisał(a):

Pamiętaj że używając funkcji array_merge(), array_values(), array_map() korzystasz z implementacji arrayów z C, a pisząc swoje for'y i funkcje, działasz na PHP. W skrócie, jeśli korzystasz z funkcji, to możesz użyć kompilowanych rozwiązań, które są szybciutkie.

Jeśli chodzi Ci o to co napisał @chomikowski

TomRiddle napisał(a):
chomikowski napisał(a):

Dziękuje, z [] + [] też działa ale z użyciem funkcji jakoś więcej pewności że będzie ok. Dlatego użyłem waszych sugestii, :) mega

To tak, samo [] + [] też połączy tablice w miare optymalnie, tak, ale plusa + oczywiście nigdy nie użyjesz dla więcej niż dwóch arrayów (dynamicznie), a to jest to co chciał autor. Żeby użyć + dla n arrayów, musiałbyś napisać swoją pętle albo swoją funkcje. + nie jest funkcją, więc nie zrobisz np array_map('+', $array) tak jak mógłbyś zrobić array_map('array_merge', $array), chyba że zrobisz lambde array_map(fn($a,$b) => $a + $b), $array), ale to znowu piszesz swoją funkcję która będzie wolniejsza niż ta z C. Nie zrobisz też spreada, + ...$array (jakkolwiek głupio to nie wygląda).

Także nie wiem o co chodzi w Twoim wpisie, ale wydaje mi się że trollujesz.

0
TomRiddle napisał(a):
$tablica = [$array1, $array2, $array3, $array4, ...];

ale już tak nie mogę?

$tablica = $array1+$array2+$array3+$array4, ...;

nie ma jak overengineering

0
Miang napisał(a):
TomRiddle napisał(a):
$tablica = [$array1, $array2, $array3, $array4, ...];

ale już tak nie mogę?

$tablica = $array1+$array2+$array3+$array4, ...;

nie ma jak overengineering

Yyy... ale to zadziała tylko dla stałych tablic? ;|

Nie zadziała dla dynamicznej tablicy (takiej która ma 2, 3, 10 elementów)? ;|

3

@TomRiddle: dlaczego nie?

<?php
	$a1 = ['1' =>1, '2'=> 2, 3];
	$a2 = ['x' =>9];
	$a3 = [77,'4p'=>'rules'];

	$a = $a1+$a2+$a3;
	var_dump($a);

Output:

Output:

array(6) {
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  ["x"]=>
  int(9)
  [0]=>
  int(77)
  ["4p"]=>
  string(5) "rules"
}

https://onecompiler.com/php/3xdq75zfv

0
jurek1980 napisał(a):

@TomRiddle: dlaczego nie?

<?php
	$a1 = ['1' =>1, '2'=> 2, 3];  // pierwszy array
	$a2 = ['x' =>9];              // drugi array
	$a3 = [77,'4p'=>'rules'];     // trzeci array

Masz dokładnie 3 arraye, i nazywają się $a1, $a2, $a3. Ja mówiłem o dynamicznej ilości array'i.

1
jurek1980 napisał(a):

Domyślam się, że chodzi Ci o coś innego niż opisujesz/ względnie ja rozumiem. Co znaczy dynamiczna liczba tablic?

$dynamiczneTablice = [
  0 => ['1' =>1, '2'=> 2, 3]; 
  1 => ['x' =>9];         
  2 => [77,'4p'=>'rules'],    
  // ...
]

lub

$dynamiczneTablice = [
  0 => ['1' =>1, '2'=> 2, 3]; 
  1 => [77,'4p'=>'rules'],    
  // ...
]

lub dowolne inne. Możesz mieć 3 tablice, 10 tablic, 2 tablice. Ich łączenie powinno działać tak samo - tak jak działa np z array_merge(). Z + plusem się tak nie da zrobić.

Podsumowując ten bezsensowny wątek:

  • Wołanie funkcji z C (np array_values(), array_map(), array_merge()) jest najoptymalniejsze
  • Plus działa tylko z dwoma tablicami, podczas gdy array_merge() działa dla n tablic (nie tablicy z n elementami, tylko dla n tablic).
2

Podsumowanie:
@jurek1980 napisał kawałek kodu który pasuje do podanych założeń
Jeżeli ktoś uważa że założeniem była dynamiczna liczba tablic to lepiej jakby się dopytał czy na pewno takie jest założenie. Przyznaję sie bez bicia że trochę tu trolluję ale zbyt często miałam do czynienia z sytuacją gdzie zamiast spytać osobę pokój obok o szczegóły ktoś se dośpiewywał resztę założeń i potem przekazywał członkom zespołu jako prawdę objawioną na kamiennych tablicach. Dobrze jeszcze jak mieli to potem na piśmie i ich nie obwiniono

0
Miang napisał(a):

Podsumowanie:

@jurek1980 napisał kawałek kodu który pasuje do podanych założeń
Jeżeli ktoś uważa że założeniem była dynamiczna liczba tablic to lepiej jakby się dopytał czy na pewno takie jest założenie. [...]

Masz na myśli to...?

chomikowski napisał(a):

Chodzi o to ze jak mam 10 tablic a chce sprawdzic i zostawic tylko unikalne numery kluczy to jak zlacze pierwsze dwie tablice to dostane index od 0, wiec nie mam jak sprawdzic pozostalych 8 tablic bo juz w tych dwoch klucze zostaly zmienione,

Mi to wygląda że jest napisane czarno na białym że autor chce sprawdzić wiele tablic. 4ty post od góry w tym wątku ;)

0
jurek1980 napisał(a):

@TomRiddle: tylko tak to każda tablica w PHP jest dynamiczna. To nie tablica z C vs Vector. No nie ważne. Nie ma co drzeć kotów. Dla mnie "dynamiczna ilość tablic" nie było zrozumiałe w kontekście wypowiedzi

Czy ja na prawdę jestem jedyną osobą która wie o czym mówi?

Porównałem te dwa przykłady:

$a1 = ['1' =>1, '2'=> 2, 3];
$a2 = ['x' =>9];
$a3 = [77,'4p'=>'rules'];

To nie jest dynamiczna ilość tablic. Owszem, tablice tutaj mają zmienną ilość elementów, ale tablic jest 3. Nazywają się $a1, $a2, $a3. Nie możesz nic zrobić w
tym programie bez jego edycji żeby dodać np $a4. Są 3 wpisane do kodu źrodłowego. I owszem, tutaj + oraz array_merge() zadziałają równie dobrze, bo ich liczba jest stała.

To do czego ja się odniosłem, mówiąc "dynamiczna ilość tablic", to miałem na myśli to, że tych tablic może być więcej, może być 1, 2, 3, 10 lub 0, i dla przykłądu podałem taki kod. Zaznaczyłem też, że taki kod nie byłby wpisany do kodu źródłowego tylko po prostu zmienna $dynamiczneTablice miała by w sobie zmienną liczbę tablic.

$dynamiczneTablice = [
  0 => ['1' =>1, '2'=> 2, 3]; 
  1 => ['x' =>9];         
  2 => [77,'4p'=>'rules'],    
  // ...
]

Tutaj + nie zadziała optymalnie, bo musiałbyś użyć tych plusów tyle ile jest tablic minus jeden, więc i tak operacje były by w runtimie PHP. Lepiej tutaj się sprawdzi array_merge().

Rozumiem że @jurek1980 i @Miang czujecie się niekomfortowo jesli nie zrozumieliście czegoś od razu; ale to nie powód żeby wprowadzać ludzi w błąd lub trollować.

Dziękuję za rozmowę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.