Miro Kepinski

Miro Kepinski Film Composer /
Award-winning
producer / Performer

Temat: Problem z SHUFFLE

Witam,

Czy ktoś mógłby pomóc z losowym sortowaniem tablicy?
Funkcja shuffle robi dziwną rzecz.

Ma do przetasowania tablicę np: 10 wartości. Raz pokazuje wszystkie 10 wyników, innym razem nie pokazuje wszystkich.

Np:

1,5,4,7,6,2,7,8,9,10

albo

1,,4,5,6,3,7,6,8,9 <-- nie ma drugiej wartości

Co można z tym zrobić?

Dzięki.

konto usunięte

Temat: Problem z SHUFFLE

pokaz kod !
nie używasz czasem foreach z tablicą przez referencję ?Krzysztof D. edytował(a) ten post dnia 29.05.12 o godzinie 17:30
Krystian Rożewicz

Krystian Rożewicz Admin. /
Programista PHP

Temat: Problem z SHUFFLE

heh, dziwny błąd :P nie spotkałem się u mnie na testowym serwerze z czymś podobnym...

ja bym ominął problem funkcją sprawdzającą, czy miejsce w tablicy nie jest puste, ale jeśli jest lepszy pomysł to poleciłbym coś innego, bo szkoda obciążać niepotrzebnie serwer :)
Miro Kepinski

Miro Kepinski Film Composer /
Award-winning
producer / Performer

Temat: Problem z SHUFFLE

Kod:

$sticky = get_option( 'sticky_posts' );
shuffle($sticky);
$lista = $sticky[0] . ',' . $sticky[1] . ',' .$sticky[2] . ',' .$sticky[3] . ',' .$sticky[4] . ',' .$sticky[5] . ',' .$sticky[6] . ',' .$sticky[7] . ',' .$sticky[8] . ',' .$sticky[9];

echo $lista;
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: Problem z SHUFFLE

Miro Kepinski:
Czy ktoś mógłby pomóc z losowym sortowaniem tablicy?
Funkcja shuffle robi dziwną rzecz.

Ma do przetasowania tablicę np: 10 wartości. Raz pokazuje wszystkie 10 wyników, innym razem nie pokazuje wszystkich.

Np:

1,5,4,7,6,2,7,8,9,10

albo

1,,4,5,6,3,7,6,8,9 <-- nie ma drugiej wartości
>
Co można z tym zrobić?
Pokazać kod.

Dla takiego fragmentu kodu problem nie występuje:
$data = array();

for ($i = 1; $i <= 10; $i++) {
$data[] = $i;
}

shuffle($data);
a jak to wygląda u Ciebie?
Waldemar Jonik

Waldemar Jonik właściciel,
webmaster,
programista, JW Web
Development

Temat: Problem z SHUFFLE

Miro Kepinski:
Kod:

$sticky = get_option( 'sticky_posts' );
shuffle($sticky);
$lista = $sticky[0] . ',' . $sticky[1] . ',' .$sticky[2] . ',' .$sticky[3] . ',' .$sticky[4] . ',' .$sticky[5] . ',' .$sticky[6] . ',' .$sticky[7] . ',' .$sticky[8] . ',' .$sticky[9];

echo $lista;


Pewnie w $sticky masz inne indeksy (może od 1 do 10 a nie od 0 do 9 )

zrób echo implode (",",$sticky);

zamiast tego klejenia ręcznie tych wartości i robienia echo $lista

konto usunięte

Temat: Problem z SHUFFLE

shuffle zmienia wskaźniki tablicy.

zrobiłbym print_r przed shuffle i po. i te wyniki porównywałKrzysztof D. edytował(a) ten post dnia 29.05.12 o godzinie 18:07
Miro Kepinski

Miro Kepinski Film Composer /
Award-winning
producer / Performer

Temat: Problem z SHUFFLE

w bazie danych tablica $sticky wyglada tak:

a:13:{i:0;N;i:1;i:130656;i:2;i:130936;i:3;i:130935;i:4;i:130889;i:5;i:130888;i:6;i:130887;i:7;i:130886;i:8;i:130667;i:9;i:130666;i:10;i:130665;i:11;i:130664;i:12;i:130663;}

Pewnie przez to piersze i:0;N pojawia się problem. Jak najprościej losowo posortować tą tablicę z pominięciem tego i:0;N ?

Tak, żebym zawsze miał "pełne" warości?

Dzięki
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: Problem z SHUFFLE

Miro Kepinski:
w bazie danych tablica $sticky wyglada tak:

a:13:{i:0;N;i:1;i:130656;i:2;i:130936;i:3;i:130935;i:4;i:130889;i:5;i:130888;i:6;i:130887;i:7;i:130886;i:8;i:130667;i:9;i:130666;i:10;i:130665;i:11;i:130664;i:12;i:130663;}

Pewnie przez to piersze i:0;N pojawia się problem. Jak najprościej losowo posortować tą tablicę z pominięciem tego i:0;N ?

Tak, żebym zawsze miał "pełne" warości?

Dzięki
1. Jeśli null znajduje się zzzzawsze na pierwszej pozycji, to zrób tak:
array_shift($sticky);
shuffle($sticky);
2. Jeśli null znaleźć się może w dowolnym miejscu tablicy, to zrób tak:
$theNull = array(null);
$data = array_diff($sticky, $theNull);
shuffle($data);
Jakub Łukasik

Jakub Łukasik Programista - tylko
zdalnie!

Temat: Problem z SHUFFLE

Miro Kepinski:
Kod:

$sticky = get_option( 'sticky_posts' );
shuffle($sticky);
$lista = $sticky[0] . ',' . $sticky[1] . ',' .$sticky[2] . ',' .$sticky[3] . ',' .$sticky[4] . ',' .$sticky[5] . ',' .$sticky[6] . ',' .$sticky[7] . ',' .$sticky[8] . ',' .$sticky[9];

echo $lista;

Poczytaj w dokumentacji na temat zachowania funkcji shuffle, a szczególnie zdanie "This function assigns new keys to the elements in array. It will remove any existing keys that may have been assigned, rather than just reordering the keys.".

Przy okazji poczytaj o funkcji implode.
Miro Kepinski

Miro Kepinski Film Composer /
Award-winning
producer / Performer

Temat: Problem z SHUFFLE

Krzysztof -> 1 rozwiązanie załatwiło sprawę!

Wielkie Dzięki Wszystkim!
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: Problem z SHUFFLE

Miro Kepinski:
Krzysztof -> 1 rozwiązanie załatwiło sprawę!

Wielkie Dzięki Wszystkim!
Nie ma sprawy :]
Jakub Łukasik

Jakub Łukasik Programista - tylko
zdalnie!

Temat: Problem z SHUFFLE

Miro Kepinski:
Krzysztof -> 1 rozwiązanie załatwiło sprawę!

Wielkie Dzięki Wszystkim!

Jaką masz gwarancję, że na pierwszej pozycji w tablicy będzie null? :)
Tomasz Wójcik

Tomasz Wójcik Senior Software
Engineer

Temat: Problem z SHUFFLE

Panowie, shuffle nigdy nic nie gubi i nie dodaje od siebie. Jedyne co robi to likwiduje dotychczasowe indeksy. Każda wartość tablicy wejściowej pozostanie w tablicy wynikowej niezależnie od obecności wartości czy typu wartości.
Obecność NULL'i w tablicy wejściowej to odrębny problem niezależny od sposobu manipulacji danymi. Radziłbym zastanowić się skąd bierze się NULL a nie usuwać go zawsze z pierwszej pozycji tablicy. Takie działanie to pół-środek i wg mnie amatorszczyzna.Tomasz Wójcik edytował(a) ten post dnia 10.06.12 o godzinie 21:23
Jarosław Kraśniewski

Jarosław Kraśniewski Programista
Aplikacji
Internetowych

Temat: Problem z SHUFFLE

W tym przypadku raczej array_filter będzie bardziej optymalna

shuffle(array_filter($sticky))


array_filter jest przynajmniej dwukrotnie szybsze od array_diff w przypadku usuwania pustych elementów, przy założeniu, że nie będziemy mieli rekordów o wartości false lub zero, które również zostaną usunięte.

.. a usuwanie tylko pierwszego elementu tablicy może w przyszłości narobić bigosu, wystarczy że będzie zmienione zapytanie, albo dane w bazie ulegną zmianie i nie będzie już wartości null na początku i pierwszy rekord nigdy nie ujrzy światła dziennego...

Warto byłoby tak jak przedmówca wspomniał zastanowić się skąd wartość null w bazie danych i czy nie lepiej byłoby przechowywać informacje o postach sticky w osobnej tabeli, niż w postaci serializowanej, gdyż serializowanie i odserializowywanie wymaga dodatkowych zasobów serwera, przy większej ilości danych w takiej tablicy może to skutkować sporym spadkiem wydajności... a z osobnej tabeli już można sobie na poziomie zapytania wykluczyć wartości null, a nawet zwrócić wyniki w kolejności losowej.Jarosław Kraśniewski edytował(a) ten post dnia 27.06.12 o godzinie 16:22

Następna dyskusja:

Problem z php i excelem




Wyślij zaproszenie do