2014-11-25 3 views
1

Данные, возвращаемые из моей базы данных, зашифрованы. поэтому выполнение заказа в конце SQL не работает. поэтому я должен сортировать на стороне сервера.PHP Сортировка массива по имени

Я вижу много вопросов об этом Я пробовал предложения, но я не могу найти сортировку. Я пробовал это routine и this one (смотри, как ближе всего к тому, что я искал).

2 вещи происходят:

1: Это не сортировать по полю имя (ключ)

2: Наш дом в приложение жалуется, что его не строка JSON больше.

Мне нужно, чтобы отсортировать это мое имя, так что мне нужно обычай рода

Я получаю мой массив установить так:

$jsonData = array(); 

...connected to the DB.... stuff here... 
//loop through the return: 

if($result->num_rows > 0) 
    { 
     while($row = $result->fetch_assoc()) 
     { 
       $row["name"] = $this->decryptData($row["name"]); 
       $jsonData["groups"][] = $row ; 

     } 

} 


    $result->close(); 
    mysqli_close($mysqli); 
    return $jsonData; 

Ответный код выглядит следующим образом:

{ 
    "groups": [ 
    { 
     "id": "71", 
     "name": "Bob", 
     }, 
    { 
     "id": "73", 
     "name": "Howard", 
    }, 
    { 
     "id": "79", 
     "name": "Sam", 

    },.... 
    ....{ 
     "id": "65", 
     "name": "Al", 

    } 
    ] 
} 

ОК, поэтому я добавил этот код в нижней части моей обычной процедуры (обратите внимание, что я пытался использовать методы):

.... код

 /*usort($jsonData, function($a, $b) { 
      return $a['name'] - $b['name']; 
     });*/ 

     usort($jsonData, function($a, $b) { 
     return strcasecmp($a['name'], $b['name']); 
     }); 

    /* and I tried this get the same output but with a php error say what I have is not a array 
     array_multisort($jsonData['name']); 
      -- and this-- 
     array_multisort($jsonData['groups']['name']); 

    */ 



$result->close(); 
     mysqli_close($mysqli); 
     return $jsonData; 

и я получаю этот результат, который немного отличается от того, что мне нужно, и его не сортируются по имени:

[ 
    [ 
     { 
      "id": "71", 
      "name": "Bob", 
      }, 
     { 
      "id": "73", 
      "name": "Howard", 
     }, 
     { 
      "id": "79", 
      "name": "Sam", 

     },.... 
     ....{ 
      "id": "65", 
      "name": "Al", 

     } 
     ] 
] 

Я потерял в данный момент.

ответ

1

Вы не можете применять арифметику к строковым значениям для сравнения; вам нужна функция строки, а не, например, strcmp() или strcasecmp(), которые возвращают значение -1, 0, или 1:

usort($jsonData, function($a, $b) { 
    return strcasecmp($a['name'], $b['name']); 
}); 
+0

Привет, Джек и спасибо, что я пропустил это, однако даже с изменением я все еще не сортирую его по имени в порядке возрастания – Mike

+0

@Mike Это просто означает, что '$ a' и '$ b' либо не являются массивами, либо не имеют ключа' 'name ''. Вы пробовали применить сортировку к '$ jsonData ['groups']'? –

+0

Да, я сделал usort ($ jsonData ["group"], function ($ a, $ b) \t {return strcasecmp ($ a ['name'], $ b ['name']); \t}); но я получаю сообщение о том, что первая коляска не является массивом. который теперь я думаю, что мой var $ jsonData неверен – Mike

0

Вы можете использовать usort

usort($jsonData['group'], function($a, $b) { return $a['name'] - $b['name']; });

и попытаться print_r($jsonData)

+0

Да, я сделал usort ($ jsonData ["group"], function ($ a, $ b) {return strcasecmp ($ a ['name'], $ b ['name']);}); но я получаю сообщение о том, что первая коляска не является массивом. который теперь я думаю, что мой var $ jsonData неверен - – Mike

+0

@mike try 'usort ($ jsonData ['group'], function ($ a, $ b) {return $ a-> name - $ b-> name ;}); – RxV