Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównanie zawartości n-tablic
Forum PHP.pl > Forum > PHP
karolmm
Witam,

w pętli wykonuję selecta. Wynik obrabiam i docelowo zapisuję. W rezultacie mam n-tablic lub jedną tablicę z n-tablicami w środku. Każda z nich ma jednakową budowę, tj. [0]=>string(2) "12", [1]=>string(2) "17" .... [n]=>string[1] "6" .... I teraz potrzebuję porównać wszystkie tablice i znaleźć element, który występuje w każdej z nich.

Proszę o pomoc, w jaki sposób można to zrobić. Próbowałem z array_intersect ale nie działa do końca dobrze [porównuje każdą tablicę do poprzednika].

Pozdrawiam.
Pyton_000
A ty chcesz co? Każdą z każdą?
karolmm
Tak, chcę sprawdzić wszystkie utworzone tablice i wyszukać w nich element/-y wspólne - czyli te, które występują w każdej z nich.
r4xz
Dobrze zrozumiałem, że chodzi Ci o array-intersect?
phpion
Cytat(karolmm @ 15.09.2014, 08:33:11 ) *
Próbowałem z array_intersect ale nie działa do końca dobrze [porównuje każdą tablicę do poprzednika].

No to przecież to jest to, o co Ci chodzi. Mając np. 4 tablice najpierw porównujesz 1 z 2 otrzymując część wspólną (też jako tablicę), potem tą tablicę z 3 i analogicznie dla 4. W efekcie otrzymasz część wspólną wszystkich 4 tablic. Nie musisz sprawdzać każdej z każdą.
karolmm
Witam ponownie,

mam taką strukturę tabeli... i teraz array intersect nie działa tak jak trzeba... albo ja coś źle robię. Jak widać, tutaj wynikiem powinno być tylko [product_id] => 10 bo wystepuje w każdej z tablic. Jakieś pomysły?


  1. (
  2. [0] => Array
  3. (
  4. [0] => Array
  5. (
  6. [product_id] => 10
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [product_id] => 6
  12. )
  13.  
  14. )
  15.  
  16. [1] => Array
  17. (
  18. [0] => Array
  19. (
  20. [product_id] => 10
  21. )
  22.  
  23. [1] => Array
  24. (
  25. [product_id] => 6
  26. )
  27.  
  28. )
  29.  
  30. [2] => Array
  31. (
  32. [0] => Array
  33. (
  34. [product_id] => 10
  35. )
  36.  
  37. [1] => Array
  38. (
  39. [product_id] => 12
  40. )
  41.  
  42. [2] => Array
  43. (
  44. [product_id] => 45
  45. )
  46.  
  47. [3] => Array
  48. (
  49. [product_id] => 46
  50. )
  51.  
  52. [4] => Array
  53. (
  54. [product_id] => 47
  55. )
  56.  
  57. [5] => Array
  58. (
  59. [product_id] => 48
  60. )
  61.  
  62. [6] => Array
  63. (
  64. [product_id] => 49
  65. )
  66.  
  67. [7] => Array
  68. (
  69. [product_id] => 50
  70. )
  71.  
  72. [8] => Array
  73. (
  74. [product_id] => 51
  75. )
  76.  
  77. [9] => Array
  78. (
  79. [product_id] => 52
  80. )
  81.  
  82. [10] => Array
  83. (
  84. [product_id] => 53
  85. )
  86.  
  87. )
  88.  
  89. [3] => Array
  90. (
  91. [0] => Array
  92. (
  93. [product_id] => 10
  94. )
  95.  
  96. )
  97.  
  98. )
nospor
Najpierw pisales, ze masz plaskie tablice z wartosciami tekstowymi i juz.
Teraz sie okazuje, ze jednak nie masz plaskich tablic, tylko ich wartosci są tablicami. Nic dziwnego, ze proste wywolanie intersect nie dziala jak nalezy.
kalipek
na szybko

  1.  
  2. $mainArr = [[["product_id"=>10]], [["product_id"=>2],["product_id"=>3],["product_id"=>5],["product_id"=>10]], [["product_id"=>10],["product_id"=>8],["product_id"=>9],["product_id"=>3],["product_id"=>5],["product_id"=>6]], [["product_id"=>7],["product_id"=>5],["product_id"=>10]]];
  3.  
  4. $mainArrSize = count($mainArr);
  5.  
  6. $inAll = [];
  7. foreach($mainArr as $arr)
  8. {
  9. foreach($arr as $item)
  10. {
  11. $count = 0;
  12. foreach($mainArr as $arr2)
  13. {
  14. if(in_array($item, $arr2))
  15. $count = $count + 1;
  16. }
  17.  
  18. if($mainArrSize == $count && !in_array($item, $inAll))
  19. $inAll[] = $item;
  20. }
  21. }
  22.  
  23. print_r($inAll);
  24.  
Pyton_000
@kalipek: Wartość ma być we wszystkich a nie zliczone smile.gif

@
To Ci ułatwi sprawę:
  1. <?php
  2.  
  3. function array_flatten($array)
  4. {
  5. $return = array();
  6. array_walk_recursive($array, function($x) use (&$return) { $return[] = $x; });
  7. return $return;
  8. }
  9.  
  10. $array = [
  11. 0 => [
  12. 0 => [
  13. 0 => [
  14. 'product__id' => 10,
  15. ],
  16. 1 => [
  17. 'product__id' => 1,
  18. ],
  19. ],
  20. 1 => [
  21. 0 => [
  22. 'product__id' => 10,
  23. ],
  24. 1 => [
  25. 'product__id' => 10,
  26. ],
  27. ],
  28. ]
  29.  
  30. ];
  31.  
  32.  
  33. $newArray = [];
  34. foreach($array[0] as $key => $arr)
  35. {
  36. $newArray[$key] = array_flatten($arr);
  37. }
  38.  
  39. echo '<pre>'; var_dump($newArray); die("\n".(__FILE__)." ".(__LINE__));
kalipek
Drogi Pytonie, $inAll zawiera elementy, które pojawiają się w każdej z tablic i dla przykładu podanego przez pytającego zwraca dokładnie to, czego oczekuje ("tutaj wynikiem powinno być tylko [product_id] => 10").
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.