Tablica i jej licznik wartości

0

Witam mam sobie tablice liczb z n elementami dajmy na to 1 000 i więcej mogłoby być. O wartościach tylko od 1 do 50.
Teraz chce aby w tablicy2, 50-elementowej były liczby określające ile razy wystąpiła dana liczba (z tej pierwszej tabsy).

Jak to zrobić? Nie wiem switch i ify odpadają bo było by 50 razy to samo pisane no chyba ze to ostateczność ale proszę o rade abym nie pisał 150 linijek switchem czy ifami do Berlina przez Watykan
Ja próbowałem tak:

foreach ($dane as $klucz)
{
$wyniki[$klucz] +=1;
}

1
$tablica2 = array_count_values($tablica1)
0

Jak po posortowaniu tablicy chciałbym mieć obok liczbę porządkową. (informacje jaka wartość była na danym miejscu przed sortowaniem) potrzeba drugą tablice która będzie tą funkcje realizowała. Oraz musiałbym sortować dla przykładu bąbelkowym algorytmem ?

jest na to prostszy sposób?

0
$array = [8, 5, 7];

array_walk($array, fn(&$value, $key) => $value = ['value' => $value, 'old_key' => $key]);

usort($array, fn($a, $b) => $a['value'] > $b['value']);

array_walk($array, function(&$value, $key) use (&$array) {
	$array[$value['old_key']]['old_value'] = $value['value'];
	unset($value['old_key']);
});

/*
Key: 0 value: 5 old_value: 8
Key: 1 value: 7 old_value: 5
Key: 2 value: 8 old_value: 7
*/
0

Czyli zrobiłeś mniej więcej to samo, co robi funkcja array_count_value (https://github.com/php/php-src/blob/master/ext/standard/array.c#L4111)

Możesz doprecyzować jak miałaby wyglądać tablica wynikowa? Generalnie możesz po prostu skopiować tablicę i tyle.

$notSorted = [5, 2, 6, 1, 8, 3, 9];
$sorted = $notSorted;

sort($sorted);

$diff = array_map(function ($element, $oldIndex) use ($notSorted) {
    return [
        'previous' => $notSorted[$oldIndex],
        'current' => $element,
    ];
}, $sorted, array_keys($notSorted));

Ogólnie PHP ma całą masę funkcji tablicowych, które robią to za Ciebie, nie musisz sam implementować sortowania, która swoją drogą byłoby turbo wolne w porównaniu z quicksortem, którego używa PHP w większości funkcji sortujących (https://www.php.net/manual/en/function.sort.php#refsect1-function.sort-notes).

0

Wejściowe przykładowe dane dajmy na to wyglądają tak:

1:20
2:18
3:24
4:10
5:12
6:12
7:9
8:9
9:10
10:22

A wyjściowe chciałbym aby były takie:

7:9
8:9
4:10
9:10
5:12
6:12
2:18
1:20
10:22
3:24

1

Poczytaj sobie o sortowaniu...

1

Wystarczy zwykłe sortowanie:

<?php
$array1=[
"1:20",
"2:18",
"3:24",
"4:10",
"5:12",
"6:12",
"7:9",
"8:9",
"9:10",
"10:22"
];
print_r($array1);
sort($array1,SORT_NUMERIC);
print_r($array1);
0

No problem rozwiązany. tak jak podejrzewałem na początku sortowanie bąbelkowe mnie uratowało.
brałem kod od https://lukasz-socha.pl/ i go przerobiłem na taki:

function bubbleSort(&$t,&$o, $n) {

    for($i=0;$i<$n;$i++) { // glowna petla
        $swap=false; // nie doszlo do zamiany - pozycja poczatkowa
        for($j=0;$j<$n-$i-1;$j++) { // przeszukiwanie w kazdym cyklu. Zawsze o 1 mniej.
        settype($t[$j], 'integer');  //*
        settype($t[$j+1], 'integer');  //*
            if($t[$j]>$t[$j+1]) { // jezeli element jest wiekszy od nastepnego nastepuje zamiana pozycjami
            
            $temp_o = $o[$j];//*
            $o[$j]=$o[$j+1];//*
            $o[$j+1]=$temp_o;//*
            
            
                $temp=$t[$j];
                $t[$j]=$t[$j+1];
                $t[$j+1]=$temp;
                $swap=true; // zamieniono elementy
            }
        }
        if(!$swap) { // jezeli nie doszlo do zamiany przerwij petle
            break;
        }
    }
}

ale tylko wyjaśnienie co już pisałem może mniej zrozumiale. potrzebowałem index zachować danych po sortowaniu wiec:
@jurek1980 Mi nie wystarczy zwykłe sortowanie w tym wypadku.

dziękuje wszystkim za zaangażowanie

2
Klemens napisał(a):

ale tylko wyjaśnienie co już pisałem może mniej zrozumiale. potrzebowałem index zachować danych po sortowaniu wiec:
@jurek1980 Mi nie wystarczy zwykłe sortowanie w tym wypadku.

Masz gotowe funkcje, które zachowują indeks. Masz np. asort...

1 użytkowników online, w tym zalogowanych: 0, gości: 1