Как извлечь данные из определенного массива PHP

#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
}