2015-11-07 104 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) 
) 

并且存在另一个数组称为位点我想相应地显示它们,每个循环每个站点只有一个人,并且当站点数组到达结尾时,它将开始到顶部,直到人员列表完成读取。

现场秩序阵列

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

是的确定@roullie等一下 – xerwudjohn

+0

@roullie你有什么想法?请帮助我。嘿嘿,我已经编辑我的问题 – 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; 
      } 

     } 
    } 
} 

的阵列already_printed用于知道谁已经打印以避免双重打印。当它的大小等于人的总数时,那么,我们印出每个人,所以,我们可以停止(这是外层循环所做的)。

+0

是的,我认为应该这样做。但我认为这个代码foreach($ site为$ site)'必须是'foreach($ site为$ sites)'对吗? – xerwudjohn

+0

嘿芽@vitor你能解释我是如何工作的吗? '$ person = $ people [$ i];'是直接在上面的'persons = array()'上调用的吗? – xerwudjohn

+0

即时通讯在这里有一个错误,它说'$ data = $ data [$ i]'未定义偏移量:1';' – 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

,但我想每个站点循环只显示一个人。并且它必须按照速度顺序排序@rawb – xerwudjohn

+0

嗯,我在这里有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>'; 
      } 
    } 

我并不确切地知道,如果你需要这个条件$人[“现场”] == $女孩[“现场”] ..如果你不能删除它。那只是我的感觉。

btw:你没有显示$女孩阵列,所以我只是假设只是以前计算。我假设的$ data是你正在谈论的$ persons数组。

+0

对不起,女孩是人的阵列。我编辑了我的问题,以确保清楚。 :) – xerwudjohn

相关问题