如何从特定的PHP数组中提取数据

时间:2011-02-07 23:18:13

标签: php

我有一个看起来像这样的多维数组: 基于我的目录中的类别ID索引基础数组。

$cat[category_id]

每个基础数组都有三个基础元素:

['parent_id']
['sort_order']
['name']

我想创建一个函数,允许我们以正确的排序顺序为给定的parent_category_id创建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";

3 个答案:

答案 0 :(得分:3)

假设它是这种东西:

$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',
  ),
)

(仅用于@FelixKling的var_export)

EDITv3 我已经更新了我的答案以配合OP的更新。我现在也使它在结果数组中保留原始的“category_id”值。

答案 1 :(得分:0)

首先创建一个空数组,它将用于存储结果。

$result = array();

您需要遍历初始数组,可以使用foreach()

然后,如果您的parent_category_id只是使用if语句来检查它是否是给定的ID。

如果是,只需构建并将结果推送到$result数组。

使用您喜欢的任何sort functions

使用魔法return $result;

你已经完成了。

答案 2 :(得分:0)

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
}