Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]niewiem jak połączyć tablice, bardziej rozwinięte array merg/combine ?
fiszol
post
Post #1





Grupa: Zarejestrowani
Postów: 452
Pomógł: 16
Dołączył: 25.05.2004
Skąd: Gorzów Wlkp.

Ostrzeżenie: (0%)
-----


Tablice wyglądają tak:
$arr1:
Kod
Array
(
    [0] => id1
    [1] => id2
    [2] => id3
    [3] => id2
    [4] => id1
    [5] => id4
)

$arr2
Kod
Array
(
    [0] => Array
        (
            [1] => 550
        )

    [1] => Array
        (
            [4] => 749
            [13] => 1501
        )

    [2] => Array
        (
            [2] => 2000
        )
    [3] => Array
        (
            [1] => 2017
            [9] => 25
        )
    [4] => Array
        (
            [1] => 30
            [4] => 25
        )
    [5] => Array
        (
            [2] => 1430
            [13] => 1
        )
)


Ilość kluczy w obu zawsze będzie się pokrywać, ale ta ilość może się wachać od 1 do 30. Potrzebuję porównać najpierw id z pierwszej tablicy i względem tego połączyć klucze w drugiej tablicy. W powyższej tablicy $arr1[0] == $arr1[4] i $arr1[1] == $arr1[3]. Chciałbym więc połączyć $arr2[0] z $arr2[4] oraz $arr2[1] z $arr2[3], na podstawie tego chciałbym uzyskać $arr3 która będzie wyglądała mniej więcej tak wyglądała mniej więcej tak:
Kod
Array
(
    [0] => Array
        (
            [1] => 580
            [4] => 25
        )

    [1] => Array
        (
            [1] => 2017
            [4] => 749
            [9] => 25
            [13] => 1501
            
        )
)

Proszę zwrócić uwagę na to, że klucz $arr2[0][1] ma już wartość więc kolejne jego wystąpenie (w tym wypadku) $arr2[4][1] jest dodawane do poprzedniego. Na kombinowałem się już z wręcz łańcuchowymi pętlami, ifami itd i nic nie osiągnąłem. Skończyły mi się już pomysły. Mam nadzieję że mój opis będzie dla Was zrozumiały.




Temat utonął więc odświeżę. Czy ktoś ma jakies sugestie jak się do tego zabrać?


--------------------
\o/
Go to the top of the page
+Quote Post
tehaha
post
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


normalnie staram się nie dawać gotowców, ale to było ciekawe ćwiczonko:)
  1. $arr1 = Array
  2. (
  3. 0 => 'id1',
  4. 1 => 'id2',
  5. 2 => 'id3',
  6. 3 => 'id2',
  7. 4 => 'id1',
  8. 5 => 'id4'
  9. );
  10. $arr2 = Array
  11. (
  12. 0 => Array
  13. (
  14. 1 => 550
  15. ),
  16.  
  17. 1 => Array
  18. (
  19. 4 => 749,
  20. 13 => 1501
  21. ),
  22.  
  23. 2 => Array
  24. (
  25. 2 => 2000
  26. ),
  27. 3 => Array
  28. (
  29. 1 => 2017,
  30. 9 => 25
  31. ),
  32. 4 => Array
  33. (
  34. 1 => 30,
  35. 4 => 25
  36. ),
  37. 5 => Array
  38. (
  39. 2 => 1430,
  40. 13 => 1
  41. )
  42. );
  43. $arr3 = array();
  44. $assoc = array();
  45. //przepisujemy pierwszą tablicę tak aby mieć tablicę zawierającą relacje co z czym łączymy
  46. foreach($arr1 as $key=>$value)
  47. {
  48. $assoc[$value][] = $key;
  49. }
  50. //pętla po każdym zestawie
  51. foreach($assoc as $assoc_array)
  52. {
  53. //w zestawie pętla po każdej wartości
  54. $single_array = array(); // tu będziemy przechowywać złączoną tablicę
  55. foreach($assoc_array as $array_key)
  56. {
  57. //tą pętlą połączymy tablice z $arr2
  58. foreach($arr2[$array_key] as $key => $value)
  59. {
  60. if(array_key_exists($key, $single_array))
  61. {
  62. //jeżeli klucz już istnieje to dodajemy wartość
  63. $single_array[$key] = $single_array[$key] + $value;
  64. }
  65. else
  66. {
  67. $single_array[$key] = $value;
  68. }
  69. }
  70. }
  71. $arr3[] = $single_array;
  72. }
  73. print_r($arr3);


wynik:
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [1] => 580
  6. [4] => 25
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [4] => 749
  12. [13] => 1501
  13. [1] => 2017
  14. [9] => 25
  15. )
  16.  
  17. [2] => Array
  18. (
  19. [2] => 2000
  20. )
  21.  
  22. [3] => Array
  23. (
  24. [2] => 1430
  25. [13] => 1
  26. )
  27.  
  28. )

czyli chyba o to Ci chodziło

@DOWN: za to właśnie lubię to forum, człowiek się zawsze czegoś nauczy:)

Ten post edytował tehaha 30.01.2011, 23:12:33
Go to the top of the page
+Quote Post
Wicepsik
post
Post #3





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


Zapodam krótszy kod

  1. foreach($a as $k=>$v){
  2. foreach($b[$k] as $j=>$s){
  3. $c[$v][$j]+=$s;
  4. }
  5. }
  6. print_r($c);


Ten post edytował Wicepsik 30.01.2011, 23:09:54


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 03:10