2014-01-09 6 views
0

Я был в тупике на некоторое время и задавался вопросом, есть ли способ превратить эти данные в пользовательский многомерный массив.Создание настраиваемого многомерного массива

я выполнить запрос на моем столе, и он выплевывает массив как этот

SELECT id_cms_category, name FROM cms_category_lang ORDER BY id_cms_category ASC 

Приведенное массив выглядит следующим образом.

array 
0=> 
    array 
    'id_cms_category'=> 1 
    'name'=>'Home' 
1=> 
    array 
    'id_cms_category'=> 2 
    'name'=>'Test' 

Итак я бег моего запроса на моем столе ОГО

SELECT cl.id_cms, c.id_cms_category, cl.meta_title 
FROM cms_lang cl 
LEFT JOIN cms c ON (c.id_cms = cl.id_cms) 
LEFT JOIN cms_link ci ON (ci.id_cms = cl.id_cms) 
ORDER BY c.id_cms_category, cl.meta_title ASC 

и я получаю массив как этого

array 
0 => 
array 
    'id_cms' => string '4' (length=1) 
    'id_cms_category' => string '1' (length=1) 
    'meta_title' => string 'About us' (length=8) 
1 => 
array 
    'id_cms' => string '6' (length=1) 
    'id_cms_category' => string '1' (length=1) 
    'meta_title' => string 'Contact Us' (length=10) 
2 => 
array 
    'id_cms' => string '1' (length=1) 
    'id_cms_category' => string '1' (length=1) 
    'meta_title' => string 'Delivery' (length=8) 
3 => 
array 
    'id_cms' => string '2' (length=1) 
    'id_cms_category' => string '1' (length=1) 
    'meta_title' => string 'Legal Notice' (length=12) 
4 => 
array 
    'id_cms' => string '5' (length=1) 
    'id_cms_category' => string '1' (length=1) 
    'meta_title' => string 'Secure payment' (length=14) 
5 => 
array 
    'id_cms' => string '3' (length=1) 
    'id_cms_category' => string '1' (length=1) 
    'meta_title' => string 'Terms and conditions of use' (length=27) 
6 => 
array 
    'id_cms' => string '10' (length=2) 
    'id_cms_category' => string '2' (length=1) 
    'meta_title' => string 'FAQ - UltraTech IBC Spill Pallet Plus' (length=37) 
7 => 
array 
    'id_cms' => string '9' (length=1) 
    'id_cms_category' => string '2' (length=1) 
    'meta_title' => string 'FAQ - UltraTech P2 Plus 2-Drum Hard Top Spill Pallet' (length=52) 
8 => 
array 
    'id_cms' => string '7' (length=1) 
    'id_cms_category' => string '2' (length=1) 
    'meta_title' => string 'XR-5, Urethane & Copolymer 2000' (length=31) 

Я хотел, чтобы попытаться взять все эти данные и как-то создать многомерный массив;

array 
0 => 'Home' 
     array 
     id_cms => meta_title 
1 => 'Test' 
     array 
     id_cms => meta_title 

таким образом, я должен быть в состоянии запустить что-то вроде этого

foreach($title as $key => $value) 
{ 
    <li>$value</li> 
    foreach($value as $id_cms => $page) 
    { 
     <li><a href="$id_cms">$page</a></li> 
    } 
} 

, чтобы получить выход на странице, чтобы выглядеть как этот

Home 
    home 1 
    home 2 
    home 3 
Test 
    test 1 
    test 2 
    test 3 
+0

Какой метод выборки вы используете для получения результатов? –

+0

@FabienWarniez Это использование платформы электронной коммерции Prestashop, они используют PDO и в своем классе DB их объект называется executeS, который выполняет sql-запрос и делает все данные из результата доступными в многомерном массиве. –

+0

Я вижу. См. Мой ответ ниже. –

ответ

1

Я бы не сделал два запроса для этого.

Я бы изменил ваш второй запрос, поэтому у вас есть имя категории и страницы в том же наборе результатов. Он должен выглядеть примерно так:

SELECT cl.id_cms, c.id_cms_category, catlang.name, cl.meta_title 
FROM cms_lang cl 
LEFT JOIN cms c 
    ON (c.id_cms = cl.id_cms) 
LEFT JOIN cms_link ci 
    ON (ci.id_cms = cl.id_cms) 
LEFT JOIN cms_category_lang catlang 
    ON (catlang.id_cms_category = cl.id_cms_category) 
ORDER BY c.id_cms_category, catlang.name, cl.meta_title ASC; 

Тогда вы можете создать цикл, который просто проверял категорию на каждой итерации. Если он найдет новый, завершите предыдущий блок и запустите новый:

$currentCategory = ''; 
$output = ''; 
foreach ($rows as $row) { 
    if ($currentCategory != $row['name']) { 
     $output .= '</li><li>' . $row['name']; 
    } 
    $currentCategory = $row['name']; 
    $output .= '<li><a href="' . $row['id_cms'] . '">' . $row['meta_title'] . '</li>';  
} 

// Trim off our unnecessary </li> 
$output = substr($output, 4); 
-1
  1. Создать новый пустой массив: $newArray = array();
  2. Пройдите свой результат с помощью foreach, t Курица, как вы идете, проверьте, если категория текущего элемента уже существует в новом массиве: if (isset($newArray[$row['id_cms_category']))
  3. Если этого не произойдет, создать и инициализировать его с новым массивом, содержащим элемент в качестве первого элемента: $newArray[$row['id_cms_category'] = array($row);
  4. Если он уже существует (т.е. вы уже прошли предмет, относящийся к этой категории), а затем добавьте его: $newArray[$row['id_cms_category'] []= $row;

Вот и все!

+0

Это не сработает. Почему вы используете «id_cms_category» в качестве ключа, когда он не уникален для каждой записи? Как вы знаете, код использует $ row? – Dave

+0

Это не уникально для каждой записи, именно то, что OP хочет сделать, это группировать свои записи по категории. Вот почему я использую id_cms_category в качестве ключа, а значение представляет собой массив, содержащий записи, относящиеся к этой категории. –

+0

И почему $ row? Потому что он представляет одну запись/строку. Когда я говорю «просмотрите результаты», легко понять, что вам нужно сделать foreach ($ result as $ row), и вы можете заменить $ result и $ row на то, что вы хотите ... это просто имя var. –

0

Если ваша CMS возвращает численный индексный массив (и это то, что похоже на ваш пост), вы можете повторно индексировать массив, используя любой желаемый ключ.

$array = array(0 => array('id_cms' => 4, 'id_cms_category' => 1, 'meta_title' => 'About us')); 
$newArray = array(); 
foreach ($array as $v) { 
    $newArray[$v['meta_title']] = $v; 
} 
var_dump($newArray); 

Массивы жизненно важны в программировании на PHP, поэтому вы будете делать одолжение, чтобы изучить их, прежде чем идти дальше.

+0

Где массив $ array? –

+0

Это переменная PHP, которая определена как пример. – Dave

+0

В нем есть статический контент? –

Смежные вопросы