Przeszukiwanie tablicy nie działa array_search

Przeszukiwanie tablicy nie działa array_search
T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

Męczę się już z tym od godziny Mam funkcje, która tworzy tablicę .

Kopiuj
    public function setPercent($list) {
        $percent = [array(['percent']),array(['id'])];
        $i = 0;
        foreach ($list as $array) {
            if ($i == 0) {
                $percent["percent"][$i] = 100;
                $percentOne = $array->second;
                $percent["id"][$i] =  $array->id;
            }
            else {
                $sum =  ($array->second / $percentOne ) * 100;
                if ($sum < 1) {
                    $percent["percent"][$i] = 1;
                }
                else {
                    $percent["percent"][$i] = round($sum);
                }
                
                $percent["id"][$i] =  $array->id;
            }
            $i++;
        }
        return $percent;
    }

I ta tablica ma dwa klucze i teraz chcę w widoku blade php przeszukać daną tablicę percent na podstawie wartości id i wybrać index tablicy percent.

A w widoku blade mam coś takiego.

Kopiuj
@php
                            $tmp = array_search($list->id,array_column($percent, 'id'));
                            var_dump( array_column($percent, 'id'));
                        @endphp
                        <div class='level{{\App\Http\Services\Common::setColor($list->level_mood)}} level' style='width: {{$tmp}}%'>&nbsp;</div>

i teraz ogólnie instrukcja var_dump( array_column($percent, 'id')); zwraca mi pustą tablicę a powinna zwracać całe id z tabeli percent a nie zwraca.

serek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1506
1

Ale daj se var_dump($percent), to będziesz widział co masz źle, bo to widać na pierwszy rzut oka już. Brakuje Ci podstawowej wiedzy z PHP na temat tablic.

T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

Na to też wpadłem i w niej są te dane jakie mają być.

serek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1506
1

@tomixtomi0001: nie, nie są. Zobacz se jakie klucze masz w tablicy.

T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

Mam coś takiego.

Kopiuj
array(4) { [0]=> array(1) { [0]=> array(1) { [0]=> string(7) "percent" } } [1]=> array(1) { [0]=> array(1) { [0]=> string(2) "id" } } ["percent"]=> array(5) { [0]=> int(100) [1]=> float(63) [2]=> float(39) [3]=> float(25) [4]=> float(3) } ["id"]=> array(5) { [0]=> int(96) [1]=> int(92) [2]=> int(91) [3]=> int(95) [4]=> int(93) } } 
T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

Już wiem co było

Trzeba było zamienić

Kopiuj
$percent["percent"][$i] na $percent[$i]["percent"]
serek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1506
0

Pokaż ten poprawiony kod.

T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

@serek:

Było

Kopiuj
    public function setPercent($list) {
        $percent = [array(['percent']),array(['id'])];
        $i = 0;
        foreach ($list as $array) {
            if ($i == 0) {
                $percent["percent"][$i] = 100;
                $percentOne = $array->second;
                $percent["id"][$i] =  $array->id;
            }
            else {
                $sum =  ($array->second / $percentOne ) * 100;
                if ($sum < 1) {
                    $percent["percent"][$i] = 1;
                }
                else {
                    $percent["percent"][$i] = round($sum);
                }

                $percent["id"][$i] =  $array->id;
            }
            $i++;
        }
        return $percent;
    }

A poprawione

Kopiuj
    public function setPercent($list) {
        $percent = [];
        $i = 0;
        foreach ($list as $array) {
            if ($i == 0) {
                $percent[$i]["percent"] = 100;
                $percentOne = $array->second;
                $percent[$i]["id"] =  $array->id;
            }
            else {
                $sum =  ($array->second / $percentOne ) * 100;
                if ($sum < 1) {
                    $percent[$i]["percent"] = 1;
                }
                else {
                    $percent[$i]["percent"] = round($sum);
                }
                
                $percent[$i]["id"] =  $array->id;
            }
            $i++;
        }
        return $percent;
    }
jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
2

To coś w ogóle jest nieczytelne i działa jakimś psim pędem.
Po pierwsze do zmiennej $array odnosisz się jak do obiektu. To tak jakby nazwać zmienną auto i dać tam metodę wydojKrowe.
Za 3 godziny nie będziesz pamiętał jak to działa. Może poczytaj też o kolekcjach w Laravel. No i w tej pierwszej wersji wydaje się, że w ogóle nie musiałbyś robić array_search tylko zwyczajnie odnieść się do tablicy przy użyciu klucza.

Kopiuj
           $tmp = $percent['percent'][$list->id];

Takie wyszukiwanie w tablicy to zbędne obciążanie komputera.
Przemyśl jak to dziala, nazwij porządnie zmienne itd.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10231
0
tomixtomi0001 napisał(a):

@serek:

Było
[...]
A poprawione
[...]

Ja bym to poprawił jeszcze bardziej:

Kopiuj
function mapPercents(array $list): array
{
    $percent = [];
    foreach (\array_values($list) as $key => $value) {
        if ($key === 0) {
            $firstPercent = $value->second;
            $percent[$key]['percent'] = 100;
        } else {
            $sum = ($value->second / $firstPercent) * 100;
            $percent[$key]['percent'] = $sum < 1 ? 1 : round($sum);
        }
        $percent[$key]['id'] = $value->id;
    }
    return $percent;
}

Przy czym jak $list nie jest asocjacyjna, to możesz usunąć array_values(). I zmieniłbym nazwę zmiennej $sum, bo ona wcale nie trzyma sumy tylko proporcję.

A tak serio @tomixtomi0001 To najlepiej by było jakbyś napisał co chcesz zrobić.

T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

@TomRiddle:

Zamierzam, zrobić takie coś, że mam nastroje i muszę do drugiej tablicy posortować od najmniejszego nastroju do najwiekszego, czyli w jednym przypadku musza być nastroje według tego ile nastrój trwał czasu a w drugiej tablicy muszą być według daty,godziny posortowane i teraz według daty są posortowane w tablicy $list a według długości w tablicy $percent (czemu chce tak zrobić bo muszę największego nastrojowi dać liczbę 100 a pozostałym proprocjonalnie )

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10231
0
tomixtomi0001 napisał(a):

@TomRiddle:

Zamierzam, zrobić takie coś, że mam nastroje i muszę do drugiej tablicy posortować od najmniejszego nastroju do najwiekszego, czyli w jednym przypadku musza być nastroje według tego ile nastrój trwał czasu a w drugiej tablicy muszą być według daty,godziny posortowane i teraz według daty są posortowane w tablicy $list a według długości w tablicy $percent (czemu chce tak zrobić bo muszę największego nastrojowi dać liczbę 100 a pozostałym proprocjonalnie )

Czekaj, co? o.O

Nic z tego nie rozumiem, mógłbyś to opisać dokładniej tak żeby było wiadomo o co chodzi?

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
1

@pol90: mulitkonto?

Zobacz, obecnie jak rozumem tworzysz tablice z jakimiś wartosisciami i kolorem, stylem, jak zwał tak zwał.
Możesz robić tablicę
$colors['blue'] = 100; i wtedy szukasz klucza po wartości a możesz stworzyć odwrotnie:
$colors[100] = 'blue'; i potem po rostu odwoływać się przez klucz. Bo chyba o coś takiego Ci chodzi?

T0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 198
0

@TomRiddle: No mam w jednej tablicy nastroje posortowane według daty($list) a w drugiej według długośći trwania nastroju($percent), ale na końcu w blade widoku operuje na zmiennej $list i dlatego korzystam z przeszukiwania tablicy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.