Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Łączenie duplikatów w tablicy na podstawie 2 warunków
Forum PHP.pl > Forum > Przedszkole
duli5
Witam. Szukam sposobu na połączenie duplikatów wartości w tablicy.
Oto tablica wejściowa:
  1. 0 => [
  2. "surname" => "user1"
  3. "step" => "step1"
  4. "time" => 4
  5. "data" => "2018-05-30"
  6. ]
  7. 1 => [
  8. "surname" => "user2"
  9. "step" => "step2"
  10. "time" => 5
  11. "data" => "2018-05-30"
  12. ]
  13. 2 => [
  14. "surname" => "user3"
  15. "step" => "step2"
  16. "time" => 6
  17. "data" => "2018-05-30"
  18. ]
  19. 3 => [
  20. "surname" => "user1"
  21. "step" => "step1"
  22. "time" => 7
  23. "data" => "2018-05-31"
  24. ]
  25. 4 => [
  26. "surname" => "user1"
  27. "step" => "step3"
  28. "time" => 8
  29. "data" => "2018-05-31"
  30. ]
  31. ]


Teraz chciałbym na jej podstawie utworzyć nową i uzyskać taki wynik:

  1. 0 => [
  2. "surname" => "user1"
  3. "step1" => 4
  4. "data" => "2018-05-30"
  5. ]
  6. 1 => [
  7. "surname" => "user2"
  8. "step2" => 5
  9. "data" => "2018-05-30"
  10. ]
  11. 2 => [
  12. "surname" => "user3"
  13. "step2" => 6
  14. "data" => "2018-05-30"
  15. ]
  16. 3 => [
  17. "surname" => "user1"
  18. "step1"=> 7
  19. "step3"=> 8
  20. "data" => "2018-05-31"
  21. ]
  22. ]


Nowa tablica musi zawierać wszystkie daty. Jeśli występowały dwa rekordy w danym dniu utworzone przez tego samego użytkownika, to mają być połączone. Ale w konkretny sposób: wartość klucza step z starej tablicy ma być kluczem w nowej tablicy. A wartością tego klucza ma zostać wartość Time.
Całkowie nie mam pomysłu jak się za to zabrać sad.gif
Dotychczas udało mi się jedynie wy filtrować dane na podstawie daty:

  1. $temp_array = $new_array = array();
  2. foreach($out as $key => $arr_values) {
  3. if (!in_array($arr_values['data'], $temp_array)) {
  4. array_push($temp_array, $arr_values['data']);
  5. array_push($new_array, $out[$key]);
  6. }
  7. }
  8.  
  9. $temp_array2 = [];
  10. foreach ($temp_array as $item) {
  11. $temp_array2[]['data'] = $item;
  12. }
  13.  
  14. for ($a = 0; $a < count($temp_array2); $a++) {
  15. for ($a1 = 0; $a1 < count($out); $a1++) {
  16. if ($temp_array2[$a]['data'] == $out[$a1]['data']) {
  17. $temp_array2[$a]['dane'][$a1] = $out[$a1];
  18. }
  19. }
  20. }


Ale nie wiem jak teraz połączyć duplikaty na podstawie username sad.gif
Prawdopodobnie źle sie do tego zabrałem ,ale nie wiem jak przez to przebrnąć.
Może mnie ktoś nakierować na rozwiązanie tego problemu?

Chyba mi się udało.Możecie zerknąć czy to jest dobre podejście?
A może macie jakieś inne propozycję?
  1. public function returnKey($array,$var_data,$var_user)
  2. {
  3. foreach ($array as $ke=>$im)
  4. {
  5. if($im['data'] == $var_data && $im['surname'] == $var_user)
  6. {
  7. return $ke;
  8. }
  9. }
  10. }
  11.  
  12. $xx = [];
  13. for ($q = 0; $q < count($tmp); $q++) {
  14.  
  15. $rr = returnKey($xx, $tmp[$q]['data'], $tmp[$q]['surname']);
  16. if (empty($rr)) {
  17.  
  18. $xx[$q][$tmp[$q]['step']] = $tmp[$q]['time'];
  19. $xx[$q]['surname'] = $tmp[$q]['surname'];
  20. $xx[$q]['data'] = $tmp[$q]['data'];
  21.  
  22. } else {
  23. $xx[$rr][$tmp[$q]['step']] = $tmp[$q]['time'];
  24. }
  25.  
  26.  
  27. }
SmokAnalog
Łap szalonego (bo króciutkiego) gotowca, ale przeanalizuj co tu się dzieje:

  1. $new_array = array_values(array_reduce($old_array, function (array $result, array $entry) {
  2. return [($key = implode('|', [$entry['surname'], $entry['data']])) => ($result[$key] ?? array_diff_key($entry, array_flip(['step', 'time']))) + [$entry['step'] => $entry['time']]] + $result;
  3. }, []));


Działa w PHP 7. Zmień sobie $new_array i $old_array na swoje nazwy, resztę możesz zostawić bez zmian.

Bardzo polecam array_reduce do takich zadań.
duli5
Ooo Dziękuję za pomoc smile.gif
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.