I have an array like that:
<?php
array(
array(
'id' => 1,
'parent_id' => null
),
array(
'id' => 2,
'parent_id' => 1
),
array(
'id' => 3,
'parent_id' => null
),
array(
'id' => 4,
'parent_id' => 2
)
)
I need to sort it to every child comes after it's immediate parent. So, ID 4 item should come right after ID 2.
Thanks.
Working solution : PHP has user define sorting function uasort I have used this to sort your array.
<?php
$data = array(
array(
'id' => 1,
'parent_id' => null
),
array(
'id' => 2,
'parent_id' => 1
),
array(
'id' => 3,
'parent_id' => null
),
array(
'id' => 4,
'parent_id' => 2
)
);
function cmp($a, $b) {
if ($a['parent_id'] == $b['parent_id']) {
return 0;
}
return ($a['parent_id'] < $b['parent_id']) ? -1 : 1;
}
uasort($data, 'cmp');
echo '<pre>';
print_r($data);
echo '</pre>';
This working solution works with array_multisort().
Try with:
$data = array(
array(
'id' => 1,
'parent_id' => null
),
array(
'id' => 2,
'parent_id' => 1
),
array(
'id' => 3,
'parent_id' => null
),
array(
'id' => 4,
'parent_id' => 2
)
);
$parent_ids = array();
foreach ($data as $item) {
$parent_ids[] = $item['parent_id'];
}
array_multisort($parent_ids, SORT_ASC, $data);
If you want null
values to be at the end replace that foreach
with:
foreach ($data as $item) {
if (is_null($item['parent_id'])) {
$item['parent_id'] = PHP_INT_SIZE;
}
$parent_ids[] = $item['parent_id'];
}
See result with: print_r($data);
.