#php
#php
Вопрос:
У меня есть многомерный массив, который выглядит следующим образом: Базовый массив индексируется на основе идентификаторов категорий из моего каталога.
$cat[category_id]
Каждый базовый массив имеет три базовых элемента:
['parent_id']
['sort_order']
['name']
Я хочу создать функцию, которая позволяет нам создавать список category_id и имен для данного parent_category_id в правильном порядке сортировки. Возможно ли это? Технически это одна и та же информация, но массив сконструирован странным образом для извлечения этой информации.
Вот пример определения для массива:
$cat = array();
$cat[32]['parent_id']= 0;
$cat[32]['sort_order']= 1;
$cat[32]['name']= 'my-category-name1';
$cat[45]['parent_id']= 0;
$cat[45]['sort_order']= 0;
$cat[45]['name']= 'my-category-name2';
$cat[2]['parent_id']= 0;
$cat[2]['sort_order']= 2;
$cat[2]['name'] = "my-category-name3";
$cat[3]['parent_id']= 2;
$cat[3]['sort_order']= 1;
$cat[3]['name'] = "my-category-name4";
$cat[6]['parent_id']= 2;
$cat[6]['sort_order']= 0;
$cat[6]['name'] = "my-category-name5";
Комментарии:
1. Если sort_order является числовым и уникальным для любого набора категорий на том же уровне иерархии, используйте это для индексации массива… В противном случае это стандартное рекурсивное построение родительского-> дочернего массива.
2. Не могли бы вы, пожалуйста, предоставить более полный пример вашего массива? (лучше всего с
var_export
).3. Массивы и функциональность массива в PHP очень гибкие. Однако я не понимаю вашу структуру массива. Можете ли вы print_r() свой массив? Если вы поместите выходные данные между тегами pre, они будут отображаться очень красиво: <pre><?php print_r($YourArray); ?></pre>
4. @ChristianSciberras:
<?php echo '<pre>'.print_r($yourArray,1).'<pre>';?>
кажется более элегантным, не так ли? 😉5. @Brad — Но более трудоемкий код и менее удобный для IDE (IDE не может знать о pre внутри строки 😉
Ответ №1:
Предполагая, что это что-то в этом роде:
$ary = Array(
0 => Array(
'parent_category_id' => null,
'sort_order' => 0,
'name' => 'my-category-name0'
),
1 => Array(
'parent_category_id' => 0,
'sort_order' => 1,
'name' => 'my-category-name1'
),
2 => Array(
'parent_category_id' => 0,
'sort_order' => 2,
'name' => 'my-category-name2'
),
3 => Array(
'parent_category_id' => null,
'sort_order' => 0,
'name' => 'my-category-name3'
),
4 => Array(
'parent_category_id' => 3,
'sort_order' => 0,
'name' => 'my-category-name4'
)
);
Вы можете использовать комбинацию foreach и usort для достижения того, к чему вы стремитесь.
// @array: the array you're searchign through
// @parent_id: the parent id you're filtering by
function getFromParent($array, $parent_id){
$result = Array();
foreach ($array as $category_id => $entry){
if ($entry['parent_category_id']===$parent_id)
$result[$category_id] = $entry;
}
usort($result,create_function('$a,$b','return ($a["sort_order"]>$b["sort_order"]?1:($b["sort_order"]<$a["sort_order"]?-1:0));'));
return $result;
}
var_export(getFromParent($ary,0));
РЕДАКТИРОВАТЬ Извините, исправлены некоторые синтаксические ошибки. Протестировано и работает (по крайней мере, чтобы привести к тому, что я намеревался)
EDITv2 Вот необработанный вывод из приведенного выше:
array (
0 =>
array (
'parent_category_id' => 0,
'sort_order' => 1,
'name' => 'my-category-name1',
),
1 =>
array (
'parent_category_id' => 0,
'sort_order' => 2,
'name' => 'my-category-name2',
),
)
(Использовал var_export специально для вас @FelixKling)
EDITv3 Я обновил свой ответ, чтобы соответствовать обновлению OP. Теперь я также сохраняю исходные значения «category_id» в результирующем массиве.
Ответ №2:
Сначала вы создаете пустой массив, он будет использоваться для хранения вашего результата.
$result = array();
Вам нужно выполнить итерацию по вашему исходному массиву, вы можете использовать foreach()
.
Затем, учитывая ваш parent_category_id
, просто используйте if
инструкцию, чтобы проверить, является ли это заданным идентификатором или нет.
Если это так, просто создайте и перенесите результат в свой $result
массив.
Используйте любую из функций сортировки, которые вам нравятся
Используйте магию return $resu<
Вы закончили.
Ответ №3:
function returnSortedParents($categories, $target_parent){
$new_list = array();
foreach($categories as $index => $array){
//FIND ONLY THE ELEMENTS MATCHING THE TARGET PARENT ID
if($array['parent_category_id']==$target_parent){
$new_list[$index = $array['sort_order'];
}
return asort($new_list); //SORT BASED ON THE VALUES, WHICH IS THE SORTING ORDER
}