2015-12-11 3 views
6

Я хочу сортировать массив на основе дочерних значений, я хочу, чтобы родительский дочерний массив в первой позиции, затем его дочерний элемент, а затем его большой ребенок и т. Д. ... на основе его «родительского» значения здесь мой пример массива,Сортировка дочернего массива в php

$array= Array( 
      Array("self"=>"user4", "parent"=>"user6"), 
      Array("self"=>"user2", "parent"=>"user1"), 
      Array("self"=>"user1", "parent"=>"user4"), 
      Array("self"=>"user5", "parent"=>"user2"), 
      Array("self"=>"user6", "parent"=>"user3"), 
      Array("self"=>"user3", "parent"=>"Parent") // it will be anything 
     ); 

этот массив должен быть отсортирован, как показано ниже

Array(
[0] => Array 
    (
     [self] => user3 
     [parent] => Parent 
    ) 

[1] => Array 
    (
     [self] => user6 
     [parent] => user3 
    ) 

[2] => Array 
    (
     [self] => user4 
     [parent] => user6 
    ) 

[3] => Array 
    (
     [self] => user1 
     [parent] => user4 
    ) 

[4] => Array 
    (
     [self] => user2 
     [parent] => user1 
    ) 

[5] => Array 
    (
     [self] => user5 
     [parent] => user2 
    )) 
+0

Вы не указали шаблон. Можете ли вы добавить фактический выходной код, чтобы мы могли предположить. В настоящий момент неясно, как вы его сортируете по дочернему или родительскому значению. –

+0

@ rajausman haider, я сортируюсь по родительским значениям, это может быть что угодно, если этот родитель ссылается на любой ребенок, тогда он должен появиться после родителя, в основном это родительский шаблон. – Sanjay

+0

Может ли товар иметь более одного ребенка? – santaka

ответ

3

Вы можете использовать его следующим образом:

$array= Array( 
      Array("self"=>"user4", "parent"=>"user6"), 
      Array("self"=>"user2", "parent"=>"user1"), 
      Array("self"=>"user1", "parent"=>"user4"), 
      Array("self"=>"user5", "parent"=>"user2"), 
      Array("self"=>"user6", "parent"=>"user3"), 
      Array("self"=>"user3", "parent"=>"Parent") // it will be anything 
     ); 
$result = ""; 
foreach($array as $val) 
{ 
    if($val['parent']== 'Parent') 
    { 
     $result[] = $val; 
     getNextNode($val['self']); 
    } 
} 
function getNextNode($child) 
{ 
    global $array; 
    global $result; 
    foreach($array as $val) 
    { 
     if($val['parent'] == $child) 
     { 
      $result[] = $val; 
      getNextNode($val['self']); 
     } 
    } 
} 
echo "<pre/>"; 
print_r($result); 

Вы получаете желаемый результат.

+0

Я не думаю, что это нужно сделать, если PHP предоставляет такие функции, как * usort * –

2

пожалуйста смотрите Topological Sorting. Это может быть полезно для вас

+1

ссылки могут быть прокомментированы, это не может быть ответ –

2

Обычно, когда вам нужно что-то сортировать на PHP, вы должны использовать определенную пользователем функцию сортировки (http://php.net/manual/es/function.usort.php), как этот. Обратите внимание, что если вы хотите сохранить индексы массива, вы должны использовать функцию uasort вместо функции usort. Это будет держать ваш код коротким и чистым.

function cmp($a, $b) { 
    if($a['parent'] == 'Parent' || $a['self'] == $b['parent']) 
     return -1; 
    if($b['parent'] == 'Parent' || $b['self'] == $a['parent']) 
     return 1; 
    return 0; 
} 

$array= Array( 
     Array("self"=>"user4", "parent"=>"user6"), 
     Array("self"=>"user2", "parent"=>"user1"), 
     Array("self"=>"user1", "parent"=>"user4"), 
     Array("self"=>"user5", "parent"=>"user2"), 
     Array("self"=>"user6", "parent"=>"user3"), 
     Array("self"=>"user3", "parent"=>"Parent") // it will be anything 
    ); 

usort($array, 'cmp'); 
print_r($array); 

Здесь user, кто не имеет родителя определяется с «Родитель», как parent, но это может быть что-то вроде false в этом случае вам просто нужно обновить функцию cmp соответственно.

Извините за форматирование, это действительно сложно по телефону. Не стесняйтесь редактировать его.

Смежные вопросы