如何基于主键和外键输出数组

Considering this array

Array
(
[0] => Array
    (
        [id] => 51
        [category_id] => 37
        [title] => Sims
    )

[1] => Array
    (
        [id] => 37
        [category_id] => 26
        [title] => Blackberry
    )

[2] => Array
    (
        [id] => 26
        [category_id] => 0
        [title] => Mobile Device
    )

I would like to be able to print out:

Mobile Device > Blackberry > Sims

Based on the relationship between category_id and id.

<?php

$array = Array(
    array('id' => 51, 'category_id' => 37, 'title' => 'Sims'),
    array('id' => 37, 'category_id' => 26, 'title' => 'Blackberry'),
    array('id' => 26, 'category_id' => 0, 'title' => 'Mobile Device'));

// First build an associative array ID->Object
$map = array();
foreach( $array as $value )
{
  $map[$value['id']] = $value;
}

// Then build your path
$path = array();
$value = $array[0];
while( true )
{
    $path[] = $value['title'];
    if( $value['category_id'] == 0 )
    {
        break;
    }
    $value = $map[$value['category_id']];
    if( !isset($value) )
    {
        die("Data Inconsistency");
    }
}


// Display path
echo implode(array_reverse($path), ' > ');

?>

Try array_multisort()

Can you use the id as the key into the array? It will make your life a bit simpler. For example, if you define your array:

Array
(
[51] => Array
    (
        [id] => 51
        [category_id] => 37
        [title] => Sims
    )

[37] => Array
    (
        [id] => 37
        [category_id] => 26
        [title] => Blackberry
    )

[27] => Array
    (
        [id] => 26
        [category_id] => 0
        [title] => Mobile Device
    )

Then you can write code like:

//assume $a is your array, defined above
//and that you have used the id for the array key
$id = 51

do {
print $a['title'];
$id = $a['category_id'];
}while($id != 0);

EDIT: array_multisort probably isn't cleanest way to do this.

Does your original array also contains entries that are to be left out?

If not, use this:

$sort_array = array();
foreach ($original_array as $key => $value) {
    $sort_array[] = $value['category_id'];
}

array_multisort($sort_array, SORT_ASC, $original_array);

The above will sort $original_array based on the category_id index.

If your array contains entries that have nothing to do with the rest, and you want to leave them out, you have to use something like this:

// remap keys based on category_id
$parts = array();
foreach ($original_array as $array) {
    $parts[$array['category_id']] = $array;
}

// build tree list
$category_id = 0;
$result = array();
while (isset($parts[$category_id])) {
   $result[] = $parts[$category_id]['title'];
   $category_id = $parts[$category_id]['id'];
}

echo implode(' > ', $result);