Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: operacje na dwoch tablicach
Forum PHP.pl > Forum > PHP
pag-r
Wiem, ze to nie problem jezyka, tylko moich brakow w mysleniu algorytmicznym, ale nie mam pojecia jak rozwiazac ten problem.
Mianowicie mam 2tablice o identycznej wielkosci np
Kod
$a = array(1,2,3,4,4);
$b = array(5,6,7,8,9);

a w wyniku potrzebuje miec pola z tablicy $a, w ktorych wartosci sa identyczne (w moim przypadku dla liczby 4 sa ta pola o indeksach 3 i 4 z tablicy $a, kiedy już bede miał te indeksy chce dodać do siebie wartości z tablicy $b, dla którch indeksy sa analogiczne czyli liczby $b[3] = 8 i $b[4] = 9. i zeby suma tych wartosci byla trzymana np w tablicy, ktora oprocz tej sumy, bedzie trzymala indeks np z spod pierwszej z tych wartosci czyli $a[3]. Nie wiem w jaki inny sposob to opisac.
tvister
Uwaga freestyle
  1. $wyjscie = array();
  2. $ii = 0;
  3. foreach(array_unique($a) as $k => $w) {
  4. if (count(array_keys($a,$w)){
  5. foreach(array_keys($a,$w) as $kk => $ww) {
  6. $wyjscie[$ii] += $b[$kk];
  7. }
  8. $ii++;
  9. }
  10. }
  11.  
pag-r
Kod
Array (     [0] => 5     [1] => 5     [2] => 5     [3] => 11 )

Hmm chyba nie do konca taki mial byc efekt koncowy:), ale w kazdym razie pojde w tym kierunku i moze cos mnie oswieci. Jakkolowiek dziekuje za szybka odpowiedz.
thek
Tvister... Przetestowałem kod... brak efektu. Var_dump nawet zmiennej $wyjście nie wyświetla.
Tu jest nieco poprawiona moja wersja.. Na bank działająca i testowana:
  1. $a = array(1,2,3,4);
  2. $b = array(5,6,7,8);
  3. $test = array_unique($a);
  4. $sum = array();
  5. if(count( $a ) != count( $test ) ) {
  6. foreach($a as $k => $v) {
  7. if( array_key_exists( $k, $test) ) {
  8. continue;
  9. } else {
  10. $search = array_keys($a, $v);
  11. foreach($search AS $tv) {
  12. $sum[ $a[$search[0]] ] += $b[$tv];
  13. }
  14. }
  15. }
  16. }
  17. var_dump($sum);
Dla podanego zestawu var_dump walnie pustą tablicę... -> array(0) { }
Jeśli zwiększysz do
  1. $a = array(1,2,3,4,4);
  2. $b = array(5,6,7,8,9);
to wyświetli -> array(1) { [4]=> int(17) }
EDIT: Problem sprawia fakt, że array unique wywala wszystkie wartości unikalne. Jeśli masz podwójną 4 to i tak poda w array_unique 4. Tyle że opierając się o samą tablicę nie dowiesz się, która z nich ma więcej niż jedno wystąpienie winksmiley.jpg Sam to musisz sprawdzić. Optymalizować prosto moją jeszcze można. Zamiast foreach'ować po $a, można po $test, bo ma już te unikalne wartości, ale trzeba by nieco przerobić funkcję smile.gif

EDIT2: Tu masz wersję lecącą już po kluczach unikatowych smile.gif
  1. $a = array(1,2,3,4,4);
  2. $b = array(5,6,7,8,9);
  3. $test = array_unique($a);
  4. $sum = array();
  5. if(count( $a ) != count( $test ) ) {
  6. foreach($test as $k => $v) {
  7. $search = array_keys($a, $v);
  8. if( count($search) > 1) {
  9. foreach($search AS $tv) {
  10. $sum[ $a[ $search[0] ] ] += $b[$tv];
  11. }
  12. }
  13. }
  14. }
  15. var_dump($sum);

EDIT3: Bym zapomniał... W moim przykładzie jest jako klucz wartość dublującej się wartości. Jeśli chcesz indeks pierwszego klucza jaki ją posiada to też żaden problem smile.gif Zamień
  1. $sum[ $a[ $search[0] ] ] += $b[$tv];

na
  1. $sum[ $search[0] ] += $b[$tv];
pag-r
wiem sprawdziłem własnie z powtarzającym sie cyframi, wielkie, ogromne dzieki - ten problem nie dawal mi spokoju od prawie tygodnia i nie moglem wymozdzyc rozwiazania, a wlasnie o taki efekt mi chodzilo, oczywiscie kliklnalem "pomogł" smile.gif. jeszcze raz dziekuje

//edit wersja poprawiona jest dokladnie tym czego potrzebuje smile.gif, potrzebne mi to zeby pobrac $_POST'em tablice1[] z option'ow a druga tablice2[] z input'ow i jedyny pomysl jaki przyszedl mi na mysl to wlasnie stworzenie takiego algorytmu, ktory umozliwia policzenie wartosci z drugiej tablicy, dla ktorych id sie powtarza w tablicy1. Pomysl mialem, ale zrealizowac juz jakos tego nie potrafilem //skill it still too low winksmiley.jpg. W kazdym razie jeszcze raz dziekuje.
thek
Jak sam napisałeś... Nie jest tu problemem brak znajomości języka, ale sam algorytm. Jeśli rozwiążesz algorytm to potem już wykorzystanie odpowiednich funkcji języka jest proste. Nie język, ale pisanie algorytmów są w programowaniu najważniejsze. Bo pisząc wydajne i optymalne algorytmy jesteś uniezależniony od języka. ten sam możesz dać różnym programistom i obaj wyskrobią na jego podstawie kod, w zależności już od własnych umiejętności i znajomości danego języka. Ale bez algorytmu motali by się Ci słabsi nawet kilka, kilkanaście razy dłużej i poprawiali swój kod wielokrotnie smile.gif
Co gorsza, nie ma czegoś takiego jak książka do nauki algorytmów. Są jedynie książki ze schematami, kiedy pewne gotowe algorytmy stosować. Algorytmy pisać uczysz się przez praktykę i logiczne myślenie oraz zauważanie zależności. Mój kod więc przebiegał tak:
1. Wyłap wszystkie unikalne wartości. //aray_unique
2. Jeśli liczba unikalnych i liczba wszystkich są takie same to olej sprawdzanie bo wszystkie są unikalne // można olać bo nic nie robisz więc if nie ma else smile.gif
3. Jeśli nie ma równości to sprawdzaj ile jest elementów w źródle o tej konkretnej wartości unikalnej. // if(count( $a ) != count( $test ) ) { foreach($test as $k => $v) {
4. Jeśli więcej niż jedna to wyciągnij wszystkie indeksy z tą wartością. // if( count($search) > 1) { $search = array_keys($a, $v);
5. Wstaw do tablicy wyników pod indeksem o wartości tego klucza (lub pierwszym indeksie) sumę wartości z drugiej tablicy o tych samych kluczach. // foreach($search AS $tv) { $sum[ $a[ $search[0] ] ] += $b[$tv];
pag-r
dzieki za opis algorytmu, sam kombinowalem naprawde kilka dni, zdaje sobie sprawe z brakow w algorytmicznym mysleniu, ale wiem tez, ze tylko pisaniem i rozwiazywaniem okreslonych problemow moge zrobic krok dalej. Choc z drugiej strony zdarza mi sie tez napisac algorytm komus, wiec czasem nawet mysle logicznie smile.gif. A tak serio w teorii widzialem jaki mam input, jaki chce output ale juz samego how-to nie moglem wymozdzyc. W kazdym razie to co mialo byc efektem jest wlasnie dzieki Twojemu rozwiazaniu i pieknie smiga w kodzie strony. Wiec nie pozostaje mi nic innego jak napisac: Chylę czoła przed mądrzejszymi ode mnie.
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.