У меня многомерный массив, который выглядит так: Базовый массив индексируется на основе идентификаторов категорий из моего каталога.
$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";
Предполагая, что это что-то вроде этого:
$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));
EDIT Извините, исправлены некоторые синтаксические ошибки. Протестировано и работает (по крайней мере, чтобы добиться того, что я намеревался)
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» в массиве результатов.
Сначала вы создаете пустой массив, он будет использоваться для хранения вашего результата.
$result = array();
Вам нужно выполнить итерацию через ваш начальный массив, вы можете использовать foreach()
.
Затем, учитывая, что ваш parent_category_id
просто использует оператор if
чтобы проверить, является ли данный идентификатор или нет.
Если это так, просто создайте и подтолкните свой результат к вашему массиву $result
.
Используйте любую из функций сортировки, которые вам нравятся
Используйте магический return $result;
Все готово.
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 }