Переупорядочить элементы массива, если они удовлетворяют условию - PullRequest
1 голос
/ 20 августа 2011

Массив:

array(
  '354' => array( 
             'parent' => 0
           ),

  '370' => array( 
             'parent' => 0
           ),

  '420' => array( 
             'parent' => 354
           ),

)

Как я могу переместить все элементы, у которых есть родительское значение! = 0, сразу после элемента, ключ которого совпадает с родительским значением?

Например, элемент с ключом 420 выше должен идти после элемента с ключом 354 ...

Ответы [ 2 ]

1 голос
/ 20 августа 2011

В общем случае это невозможно. В вашем примере это будет работать.

Но вот еще один пример:

Number | Parent
10     | 1
11     | 1
100    | 10
101    | 10
102    | 10
1000   | 100
1001   | 100

Итак, вы хотите, чтобы все три строки 100, 101, 102 шли сразу после строки 10, что невозможно.

А между строками 100 и 101 вам, вероятно, понадобятся строки 1000 и 1001, поскольку их родителем является 100.

[Update]

Таким образом, остаются следующие вопросы:

  • Вам просто нужно упорядочить узлы так, чтобы каждый узел был определен где-то до того, как он будет использован в качестве родительского?
  • Должны ли прямые дети следовать за родителями напрямую, или между ними могут быть какие-то другие узлы?
  • Всегда ли родительский идентификатор меньше, чем идентификатор узла?
0 голосов
/ 20 августа 2011

Может быть, вы ищете способ создания плоского массива с какой-то иерархией?

Это очень простой случай, при котором ваши дети всегда имеют более высокий идентификатор, чем их родители.

<code><?php
$array = array(
  '354' => array( 
             'parent' => 0
           ),
  '370' => array( 
             'parent' => 0
           ),
  '420' => array( 
             'parent' => 354
           ),
  '550' => array(
             'parent' => 420
           ),
);


/**
 * 
 * This function will convert a flat array with elements to the proper hierarchy structure
 * @param array $array
 */
function hierarchy(&$array) {
    arsort($array);
    foreach($array as $key => $value)
    {
        if($value['parent'])
        {
            $array[$value['parent']]['children'][$key] = $value;
            unset($array[$key]);
        }
    }
    asort($array);
    return $array;
}

(print '<pre>' . print_r(hierarchy($array), true) . '
');

Вот контрольный пример:

http://codepad.org/RT51uOfn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...