Вы используете очень устаревшие функции mysql, которые будут удалены в будущем. Вы должны начать переводить свои знания на интерфейс PDO для доступа к базе данных. Среди многих преимуществ использования PDO, он предлагает отличную функциональность, которая принесет вам пользу. Следует отметить, что использование, о котором я указываю ниже, не является наиболее эффективным способом, и если вы имеете дело с длинными списками, вы не должны этого делать. Но, его удовольствие знать, как заставить php выполнять большую часть работы для вас.
Учитывая таблицу «магазины» с одной колонке «название» и следующие примеры значений:
name
----
Black Pencil theatre Company
Bluebird Films
Foggy Camel Films
Fork and Spoon Marketing
Opaque Cat Web Design
Transparent Toaster Marketing
Content Panda Company
For Yours and Everyone Else's Eyes Only
Вы можете сначала использовать запрос для получения данных в значимом порядке:
SELECT LEFT(name, 1) AS FirstLetter, name FROM stores ORDER BY FirstLetter, name
FirstLetter name
B Black Pencil theatre Company
B Bluebird Films
C Content Panda Company
F Foggy Camel Films
F For Yours and Everyone Else's Eyes Only
F Fork and Spoon Marketing
O Opaque Cat Web Design
T Transparent Toaster Marketing
Использование классов PDO, мы можем получить, что данные группируются непосредственно:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=sotest', 'testuser', 'testpass');
$stmt = $dbh->query('SELECT left(name,1) as FirstLetter, name FROM stores ORDER BY FirstLetter, name');
$results = $stmt->fetchAll(PDO::FETCH_COLUMN | PDO::FETCH_GROUP);
/* $results is now =
array(5) {
["B"]=>
array(2) {
[0]=>
string(28) "Black Pencil theatre Company"
[1]=>
string(14) "Bluebird Films"
}
["C"]=>
array(1) {
[0]=>
string(21) "Content Panda Company"
}
["F"]=>
array(3) {
[0]=>
string(17) "Foggy Camel Films"
[1]=>
string(39) "For Yours and Everyone Else's Eyes Only"
[2]=>
string(24) "Fork and Spoon Marketing"
}
["O"]=>
array(1) {
[0]=>
string(21) "Opaque Cat Web Design"
}
["T"]=>
array(1) {
[0]=>
string(29) "Transparent Toaster Marketing"
}
}*/
Как вы можете видеть, PDO fetchAll уже сгруппировал их для вас. Потому что вы хотите их в определенном формате, вы можете сделать простой цикл над ними без необходимости возиться с глядя или сравнивая значения на всех:
$structured = array();
foreach ($results as $firstLetter => $companies) {
$structured[] = array(
'letter' => $firstLetter,
'result' => array_map(
function($c) { return array('name' => $c); },
$companies
)
);
}
$structured = json_encode($structured);
/* $structured is now =
[{
"letter": "B",
"result": [{
"name": "Black Pencil theatre Company"
}, {
"name": "Bluebird Films"
}]
}, {
"letter": "C",
"result": [{
"name": "Content Panda Company"
}]
}, {
"letter": "F",
"result": [{
"name": "Foggy Camel Films"
}, {
"name": "For Yours and Everyone Else's Eyes Only"
}, {
"name": "Fork and Spoon Marketing"
}]
}, {
"letter": "O",
"result": [{
"name": "Opaque Cat Web Design"
}]
}, {
"letter": "T",
"result": [{
"name": "Transparent Toaster Marketing"
}]
}]
*/
'ORDER BY СЛЕВА (имя, 1)'. Готово. –