2015-11-07 2 views
1

Как отсортировать массив на основе другого массива в php? У меня есть этот список лиц, на самом деле они являются 1300 + людьми ... Я буду показывать только 22 людей здесь :)Как отсортировать массив из другого массива в php?

людей массива:

Array ( 
    [0] => Array ([name] => Kay [site] => ex [rate] => 10) 
    [1] => Array ([name] => Kat [site] => ih [rate] => 9.7) 
    [2] => Array ([name] => Kate [site] => tp [rate] => 9) 
    [3] => Array ([name] => rina [site] => tc [rate] => 9.8) 
    [4] => Array ([name] => Katay [site] => cfnm [rate] => 6.8) 
    [5] => Array ([name] => teriay [site] => sn [rate] => 7.6) 
    [6] => Array ([name] => Kaay [site] => tla [rate] => 9.7) 
    [7] => Array ([name] => na Kay [site] => bsc [rate] => 9.5) 
    [8] => Array ([name] => qwerty [site] => tdp [rate] => 9.5) 
    [9] => Array ([name] => Katey [site] => hd [rate] => 9.4) 
    [10] => Array ([name] => Kat Kay [site] => ss [rate] => 9.2) 
    [11] => Array ([name] => ina Kay [site] => pv [rate] => 9.43) 
    [12] => Array ([name] => ina [site] => rat [rate] => 9.32) 
    [13] => Array ([name] => atay [site] => trw [rate] => 9.32) 
    [14] => Array ([name] => erina [site] => tlm [rate] => 9.43) 
    [15] => Array ([name] => Ky [site] => ol [rate] => 8.34) 
    [16] => Array ([name] => ikay [site] => tb [rate] => 7.34) 
    [17] => Array ([name] => jay [site] => ta [rate] => 6.5) 
    [18] => Array ([name] => saday [site] => hfy [rate] => 4.6) 
    [19] => Array ([name] => tarans [site] => sd [rate] => 6.54) 
    [20] => Array ([name] => dastw [site] => si [rate] => 6.4) 
    [21] => Array ([name] => dyr say [site] => ex [rate] => 7.6) 
) 

и Eсть другого массив называется сайт, который я хочу отобразить их соответственно, только один человек на сайт за цикл, и когда массив сайта достигнет конца, тогда он начнет вверх, пока списки людей не будут прочитаны.

массивом порядка сайта

Array ([0] => Array ([acronym] => exs [site_order] => 1) 
[1] => Array ([acronym] => ts [site_order] => 1) 
[2] => Array ([acronym] => ih [site_order] => 2) 
[3] => Array ([acronym] => tp [site_order] => 3) 
[4] => Array ([acronym] => tc [site_order] => 4) 
[5] => Array ([acronym] => cfnm [site_order] => 5) 
[6] => Array ([acronym] => sn [site_order] => 6) 
[7] => Array ([acronym] => tla [site_order] => 7) 
[8] => Array ([acronym] => bsc [site_order] => 8) 
[9] => Array ([acronym] => tdp [site_order] => 9) 
[10] => Array ([acronym] => lhd [site_order] => 10) 
[11] => Array ([acronym] => ss [site_order] => 11) 
[12] => Array ([acronym] => pov [site_order] => 12) 
[13] => Array ([acronym] => rat [site_order] => 13) 
[14] => Array ([acronym] => trw [site_order] => 14) 
[15] => Array ([acronym] => tgs [site_order] => 15) 
[16] => Array ([acronym] => tlm [site_order] => 16) 
[17] => Array ([acronym] => ol [site_order] => 17) 
[18] => Array ([acronym] => tb [site_order] => 18) 
[19] => Array ([acronym] => ta [site_order] => 19) 
[20] => Array ([acronym] => hfy [site_order] => 20) 
[21] => Array ([acronym] => sd [site_order] => 21) 
[22] => Array ([acronym] => si [site_order] => 22) 
[23] => Array ([acronym] => tse [site_order] => 23) 
[24] => Array ([acronym] => ih [site_order] => 24) 
) 

Я также хочу, чтобы отобразить их скорости. но я не могу даже отобразить правильные данные, потому что когда массив массива foreach заканчивается, он прекращает загрузку людей. это то, что мой код до сих пор ...

$x = 0; 
$num = 0; 
foreach ($site as $item) { 
     foreach ($data as $person) 
     { 
      if($site[$num]['acronym'] == $persons['site'] && $x != 1) 
      { 
       echo 'name: '.$person['site'].'<br>'; 
       echo 'site: '.$person['name'].'<br>'; 
       echo '<br>'; 

       $x++; 
      } 
     } 
     $x = 0; 
    $num++; 
} 

, что выход я хочу, например:

site: ex 
name: kay 
rate: 10 

site: tp 
name: kate 
rate: 9 

site: tc 
name: rina 
rate: 9.8 

site: ih 
name: kat 
rate: 9.7 

site: tla 
name: Kaay 
rate: 9.7 
. 
. 
. 
and so on 

Обратите внимание, что я хочу условие, что: цикл лиц заказ по заказам сайта и порядка по но только для одного человека на сайт.

Я знаю, это звучит немного сложно, но, пожалуйста, помогите мне. Я искал столько потоков здесь, что имеет ту же проблему, что и я, но не повезло. : '(

+1

Вы можете добавить свой желаемый результат? – roullie

+0

да конечно @рулли ждать минуту – xerwudjohn

+0

@roullie вы хоть представляете, как? PLS помочь мне. hehe я уже отредактировал мой вопрос – xerwudjohn

ответ

2

следующий код является возможным решением:

$already_printed = Array(); 
$total_of_people = count($people); 
// while there is someone that was not printed yet 
while(count($already_printed) < $total_of_people){ 
    // iterate thought each site 
    foreach($sites as $site){ 
     // take each person and its position in the array 
     foreach ($people as $i => $person){ 
      // if this i-th person was not printed yet 
      // and is related to this $site 
      if (! isset($already_printed[$i]) 
       && $person['site'] == $site['acronym']){ 
       // print this person 
       echo 'site: '.$person['site'].'<br>'; 
       echo 'name: '.$person['name'].'<br>'; 
       echo '<br>'; 
       // mark this i-th person as printed 
       $already_printed[$i] = true; 
      } 

     } 
    } 
} 

array already_printed используется для того, чтобы узнать, кто уже был напечатан, чтобы избежать двойной печати. Когда его размер равен общему количеству людей, мы печатаем всех, поэтому мы можем остановиться (это то, что делает внешний цикл).

+0

Да, я так думаю, попробую это. но я думаю, что этот код 'foreach ($ sites as $ site)' должен быть 'foreach ($ site as $ sites)' right? – xerwudjohn

+0

Эй, бутон @, вы можете объяснить мне, как это работает? '$ person = $ people [$ i];' это прямое обращение к 'person = array()' выше? – xerwudjohn

+0

im с ошибкой здесь он говорит 'Undefined offset: 1' на' $ data = $ data [$ i]; ' – xerwudjohn

1

Ключ организовать этот большой массив в формат, который не заставит вас итерацию через него несколько раз, чем необходимо дать этому выстрел:.

$highest = array(); 

foreach ($data as $person) { 
    if (!array_key_exists($person['site'], $highest) || ($person['rate'] > $highest[$person['site']]['rate'])) { 
     $highest[$person['site']] = $person; 
    } 
} 

foreach ($site as $item) { 
    if (array_key_exists($item['acronym'], $highest)) { 
     echo "site: {$highest[$item['acronym']]['site']}<br />name:{$highest[$item['acronym']]['name']}<br />rate:{$highest[$item['acronym']]['rate']}"; 
    } 
} 

В качестве примечания, хороший вызов по изменению «девочек» к «человеку», так что это не так очевидно, приложение, созданное для оценки женщин ...

+0

, но я хочу отобразить только один человек на контур сайта.и это должен быть порядок по курсу asc @rawb – xerwudjohn

+0

hmmm У меня есть 1300 + человек, но кажется, что они не отобразили весь список. хе-хе. но я думаю, что мы добираемся туда. – xerwudjohn

+1

Было мое понимание, что вы просто хотели, чтобы высший рейтинг отображался на сайте, но в любом случае это должно указывать на вас в правильном направлении! Подобно вышеприведенному подходу - я бы рекомендовал сначала отсортировать людей по сайту (в многомерном массиве, индексированном по сайту), а затем отсортировать каждый из этих подмассивов сайта по рейтингу, а затем перебрать все это (пока есть все же люди ушли) и повторяя, что вам нужно. Удачи и счастливого кодирования! – rawb

1

Использование кода Я хотел бы сделать что-то вроде этого:

foreach ($site as $item) { 
      $maxRate = 0; 
      $savePerson = array(); 
      foreach ($data as $person) 
      { 
       if($item['acronym'] == $girls['site'] && $person['site'] == $girls['site'] && $person['rate'] > $maxRate) 
       { 
        $maxRate = $person['rate']; 
        $savePerson = $person; 
       } 
      } 
      if(!empty($savePerson)){ 
        echo 'name: '.$savePerson['site'].'<br>'; 
        echo 'site: '.$savePerson['name'].'<br>'; 
        echo '<br>'; 
      } 
    } 

Я не знаю точно, если вам нужно это условие $ человек [ «сайт»] == $ девочек [ «сайт»] ..Если вы не можете удалить его. Это было только мое чувство.

Кстати: вы не показывали массив $ girls, поэтому я просто предполагаю, что он просто вычисляется ранее. И $ data, которые я предполагаю, это массив $ persons, о котором вы говорите.

+0

Извините, что девушки - это массив лиц. Я отредактировал свой вопрос выше, чтобы быть уверенным и понятным. :) – xerwudjohn

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