2015-08-13 4 views
1

У меня есть array, который содержит некоторые другие arrays. Ниже я сделаю образец исходной структуры, чтобы понять мою проблему.Переместить элементы массива в начало многомерного массива

$foo = array(
[0] => array('name' => foo, 'offered' => 1) 
[1] => array('name' => foo) 
[2] => array('name' => foo, 'offered' => 1) 
[3] => array('name' => foo, 'offered' => 1) 
); 

Что я хочу сделать, сортировать мой массив, чтобы получить первый каждый массив, содержащий ключ «предлагаемый». В приведенном выше примере мне нужно получить этот тип порядка. [0], [2], [3], [1].

+2

Вы имели в виду: [0], [2], [3], [1]. ? – CodeGodie

+0

Да, я исправлю это прямо сейчас! – Makis

ответ

1

Вы можете использовать uasort() с пользовательской функцией сравнения.

$foo = array(
    array('name' => 'mark', 'offered' => 1), 
    array('name' => 'joe'), 
    array('name' => 'bill', 'offered' => 1), 
    array('name' => 'hugo', 'offered' => 1) 
); 

uasort($foo, 'customSort'); 

function customSort($a, $b) { 
    $a = isset($a['offered']); 
    $b = isset($b['offered']); 
    if (($a && $b) || (!$a && !$b)) return 0; 
    else if ($a && !$b) return -1; 
    else return 1; 
} 

print_r($foo); 

Пожалуйста, проверьте:

http://php.net/manual/it/function.usort.php

http://php.net/manual/it/function.uasort.php

http://php.net/manual/it/function.uksort.php

Объяснение: (немного упрощены для новичков) При сортировке массива с этими специальными функциями сортировки , вы можете сказать PHP, чтобы использовать cu чтобы определить, является ли значение «меньше другого» (и возвращает 1) или «больше» другого (и возвращает -1) или «равно другому» (и возвращает 0). Эти функции имеют параметры ($a, $b) для сравнения двух элементов массива.

В этом случае мы решаем, что те, где существует "offered", являются «меньше» остальных, поэтому они будут отсортированы первыми.

+0

Хороший ответ Кранио! Это сделал трюк. Можете ли вы также объяснить мне, какую функцию вы использовали, потому что я немного конфискован? – Makis

+1

@Makis Я отредактировал вопрос с объяснением :) – Cranio

+0

Хорошо, теперь стало понятнее! Еще раз спасибо! – Makis

1

Я бы перебрал и проверил, существует ли ключ, в зависимости от этого, перестроить массив.

$final = []; 
foreach ($foo as $r) { 
    if (isset($r['offered'])) 
     array_unshift($final, $r); 
    else 
     array_push($final, $r); 
} 
var_dump($final); 
+0

Хорошо, но не очень эффективно, поскольку он выполняет итерацию больше времени, чем необходимо для всех элементов массива. – Cranio

+0

Это тоже трюк. Спасибо! – Makis

+1

Согласен. 'uasort' - лучший вариант. – CodeGodie

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