Nie uwierzysz co ten język programowania zrobił jednym prostym trickiem! Big Data go nienawidzi!

0

Chciałem nałożyć constraint/walidację na to jakie wartości mogą być w pewnej kolumnie w bazie. Stwierdziłem, że zrobię sobie group by'a na tej kolumnie i sprawdzę jakie i ile poszczególnych znaków tam mam. Dla przejrzystości walnąłem sobie ksort'a, a co. Patrzę a tam

BAM, BAM, BAM

A, B, C, D.... F, G, I, 0, E

Na końcu jest W, X, Y, a.

screenshot-20180528212111.png

Dziwna sparawa, nie? Ma ktoś jakieś wyjaśnienie?

PS: Uprzedzam pytania, tak wszędzie użyłem mb_ i splita regexpowego /u zamiast str_split.

0

Chciałem potem sprawdzić czy taki ksort może w jakichś magicznych przypadkach nie jest deterministyczny i odkryłem że kiedy zrobię

ksort($g);
ksort($g);
ksort($g);
ksort($g);

..to w co drugim ksort() wyżej w secie są klucze z małymi literami, a w pozostałych (co drugim +1) wyżej są klucze z wielkimi literami! :o I co 2 ksort()y sobie tak oscylują.

0

ksort ma rozne flagi, to nie to?

0

Wtf za tytuł brzmi jak reklama zużytych gaci... Serio, ja bym pomógł mimo c**** tematu, ale takie coś mnie obrzydza.

0

Nie bardzo rozumiem gdzie leży problem?

  1. Klucz 0 nie jest znakiem, więc leży gdziekolwiek (pytanie czy może być znakiem w PHP?)
  2. Klucze a-z są zwykle za A-Z w kodzie ASCII i Unicode.

Jeśli chodzi o 0, to tu jest krótkie wyjaśnienie: https://stackoverflow.com/a/10696097

1

@TomRiddle: z nudów przepisałem z palca tą tablicę i nie udało mi się odtworzyć tego błędu. Może wklej swoje dane w jsonie + daj znać jaką masz wersję PHP i wklej cały skrypt, który to przetwarza, bo gdzieś możesz mieć spieprzone klucze w tablicy.

Ogólnie PHP pozwala na różne cyrki związane z kluczami. Na przykład coś takiego (w php 5.6, w 7.2 to naprawili :P):

<?php

$data = [12 => 'test 1'];
$encoded = json_encode($data);
$decoded = (array) json_decode($encoded); // zauważ, że używam (array) a nie json_decode([], true)

var_dump($decoded);
// array(1) {
//     '12' =>
//   string(6) "test 1"
// }
var_dump(array_key_exists(12, $decoded)); // false
var_dump(array_key_exists('12', $decoded)); // false
var_dump($decoded['12']); // Notice: Undefined offset: 12

foreach ($decoded as $key => $item) {
    var_dump($key, $item); // string(2) "12" string(6) "test 1"
    var_dump($key === '12'); // TRUE :OOOO
}

Także możliwe, że po drodze "popsułeś" klucze :D

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