2016-12-12 2 views
3

я в настоящее время есть массив объектов, как показано ниже:Сравните и сортировать массив объектов против другого массива

$aa = new StdClass; 
$aa->name = 'aa'; 
$aa->index = 30; 
$bb = new StdClass; 
$bb->name = 'bb'; 
$bb->index = 30; 
$cc = new StdClass; 
$cc->name = 'cc'; 
$cc->index = 10; 
$dd = new StdClass; 
$dd->name = 'dd'; 
$dd->index = 20; 
$ee = new StdClass; 
$ee->name = 'ee'; 
$ee->index = 10; 

Я поместил свои объекты в массив для сортировки:

$arr = [$aa, $bb, $cc, $dd]; 

I также имеют дополнительный массив, который я бы хотел использовать для сортировки объектов по порядку по индексу, например $aa->index:

$map = [30, 20, 10, 10, 30]; 

Ожидаемый результат будет:

[$aa, $dd, $cc, $ee, $bb] 

Другой из $aa и $bb не определен, они должны просто не повторять и все индексы должны быть назначены где-то.

Что бы быть лучшим способом организовать $arr в порядке, установленном $mapБЕЗ использование foreach() цикла?

+0

Как вы решаете, относится ли первый индекс - '30' - к объекту' $ aa' или '$ bb'? –

+0

@JiriHrazdil случайно, я полагаю – Coffee

+0

Учитывая ваш пример - это '[$ aa, $ dd, $ cc, $ cc, $ aa]' правильный вывод? –

ответ

0

Я честно не знаю, если я понял вопрос правильно, но вот попытка вашей проблемы:

$aa = new stdClass; 
$aa->name = 'aa'; 
$aa->index = 30; 
$bb = new stdClass; 
$bb->name = 'bb'; 
$bb->index = 30; 
$cc = new stdClass; 
$cc->name = 'cc'; 
$cc->index = 10; 
$dd = new stdClass; 
$dd->name = 'dd'; 
$dd->index = 20; 
$ee = new stdClass; 
$ee->name = 'ee'; 
$ee->index = 10; 


$arr = [$aa, $bb, $dd, $cc, $ee]; 
$map = [30, 30 , 10, 20]; 

function sort_ish($arr, $map) 
{ 
    $return = []; 

    while($element = array_shift($map)) 
    { 
     foreach($arr as $key => $value) 
     { 
      if($element == $value->index) 
      { 
       $return[] = $value; 
       unset($arr[$key]); 
       break 1; 
      } 
     } 
    } 

    return $return; 
} 

print_r(sort_ish($arr, $map)); 

Какой будет выход:

Array 
(
    [0] => stdClass Object 
(
    [name] => aa 
[index] => 30 
     ) 

    [1] => stdClass Object 
(
    [name] => bb 
[index] => 30 
     ) 

    [2] => stdClass Object 
(
    [name] => cc 
[index] => 10 
     ) 

    [3] => stdClass Object 
(
    [name] => dd 
[index] => 20 
     ) 

) 

Действительно, у меня было использовать foreach.

В другом примечании, мне было очень весело с этим вопросом, даже если я не понял это правильно. Спасибо ОП.

0

Я сделал это, технически не вызывая цикл foreach(), но я выполняю цикл с использованием рекурсивной функции. Все, что вам нужно сделать, это передать массив объектов ($arr) в качестве первого параметра и вашей карты массива ($mapArr) в качестве вашей второй функции: . mrSorty() затем берет его отсюда, передавая ваш массив объектов через магические функции, такие как array_search() и ksort().

$arr = [$aa, $bb, $cc, $dd, $ee]; 
$mapArr = [30, 20, 10, 10, 30]; 

function mrSorty($arr, $mapArr, $objCount=0) { 

    static $newArr; 

     if ((count($mapArr)) > 0 && $objCount < ($objCount+count($mapArr))) { 

      $obj = $arr[$objCount]; 
      $key = array_search($obj->index, $mapArr); 
      $newArr[$key] = $obj; 
      unset($mapArr[$key]); 
      mrSorty($arr, $mapArr, ++$objCount); 
     } 

     ksort($newArr); //Sort the Array by Key 
     return $newArr; 
} 



$arrayReturn = mrSorty($arr, $mapArr); //Array of Objects & Array Map 

var_dump($arrayReturn); 

Выход

array(5) { 
[0] => object(stdClass) #1 (2) { ["name"]= > string(2)"aa" ["index"] => int(30)} 
[1] => object(stdClass) #4 (2) { ["name"]= > string(2) "dd" ["index"] => int(20)} 
[2] => object(stdClass) #3 (2) { ["name"]= > string(2) "cc" ["index"] => int(10)} 
[3] => object(stdClass) #5 (2) { ["name"]= > string(2) "ee" ["index"] => int(10)} 
[4] => object(stdClass) #2 (2) { ["name"]= > string(2)"bb" ["index"] => int(30)} 
} 

Edit:

На серьезное внимание, если вам нужно мне вдаваться в подробности, то дайте мне знать.

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