基于另一个数组和一个子数组字段的Php排序数组

时间:2014-08-27 14:02:09

标签: php arrays sorting

我正在尝试创建一个靠近餐馆的应用程序,我使用数据库通过zipcodes检索附近

所以我现在有一个类似

的数组
$sortLike=array(60007,60001,60003,60002);

和数据库返回数组,如

$array1= array( array ('ID' => 138,'zip_code' => 60007,'approved' => 1),
                array('ID' => 103,'zip_code' => 60007,'approved' => 0),
                array('ID' => 124,'zip_code' => 60002,'approved' => 0),
                array('ID' => 104,'zip_code' => 60002,'approved' => 1),
                array('ID' => 105,'zip_code' => 60003,'approved' => 0),
                array('ID' => 106,'zip_code' => 60001,'approved' => 0),
                array('ID' => 114,'zip_code' => 60007,'approved' => 0)
);

所以我需要显示所有被批准的餐馆,但是按照$ sortLike数组的顺序 即返回的数组应该是

   $array1= array(  
                    array ('ID' => 138,'zip_code' => 60007,'approved' => 1),
                    array('ID' => 103,'zip_code' => 60007,'approved' => 0),
                    array('ID' => 114,'zip_code' => 60007,'approved' => 0)
                    array('ID' => 106,'zip_code' => 60001,'approved' => 0),
                    array('ID' => 105,'zip_code' => 60003,'approved' => 0),
                    array('ID' => 104,'zip_code' => 60002,'approved' => 1),
                    array('ID' => 124,'zip_code' => 60002,'approved' => 0),
    );

这是我试过的

function sortarray1($mylist,$mainZipSearch){
    $newList=$newList2=$newList3 = array();
    $j=$k=$l=0;
    if(count($mylist))
    {
        foreach($mylist as $k=>$v) {
            if( $v['approved']==1 && $v['zip_code']==$mainZipSearch){
                    $newList[$j]    =   $mylist[$k];
            } 
            else if( $v['approved']==0 && $v['zip_code']==$mainZipSearch){
                    $newList2[$k]   =   $mylist[$k];    
            }
            else{
                    $newList3[$l]   =   $mylist[$k]; 
            }
            $j++;$k++;$l++;
        }
        $newList=array_values($newList);
        $newList2=array_values($newList2);
        $newList3=array_values($newList3);
        $arr=array_merge($newList,$newList2,$newList3 );
    }
    return

}

3 个答案:

答案 0 :(得分:2)

你走得太远了!

使用usort可以更轻松地处理这些问题。

function sort_results ($a, $b) {
   $sortLike=array(60007,60001,60003,60002);
   // Push unknown values at the end of the array
   if (!in_array ($a['zip_code'], $sortLike)) { return 1; } 
   return array_search($a['zip_code'], $sortLike) > array_search($b['zip_code'], $sortLike);
}

usort ($arr, 'sort_results');

print_r ($arr);

Array ( 
    [0] => Array ( [ID] => 114 [zip_code] => 60007 [approved] => 0 ) 
    [1] => Array ( [ID] => 103 [zip_code] => 60007 [approved] => 0 ) 
    [2] => Array ( [ID] => 138 [zip_code] => 60007 [approved] => 1 ) 
    [3] => Array ( [ID] => 106 [zip_code] => 60001 [approved] => 0 ) 
    [4] => Array ( [ID] => 105 [zip_code] => 60003 [approved] => 0 ) 
    [5] => Array ( [ID] => 124 [zip_code] => 60002 [approved] => 0 ) 
    [6] => Array ( [ID] => 104 [zip_code] => 60002 [approved] => 1 ) 
    [7] => Array ( [ID] => 184 [zip_code] => 60022 [approved] => 0 )
) 

答案 1 :(得分:0)

这就是我们拥有关系数据库的原因。如果您有一个返回Zipcodes排序列表的查询,那么只需加入返回已批准餐馆的查询。

答案 2 :(得分:0)

您可以尝试这样的事情:

<?
$sortLike=array(60007,60001,60003,60002);
$array1= array( array ('ID' => 138,'zip_code' => 60007,'approved' => 1),
                array('ID' => 103,'zip_code' => 60007,'approved' => 0),
                array('ID' => 124,'zip_code' => 60002,'approved' => 0),
                array('ID' => 104,'zip_code' => 60002,'approved' => 1),
                array('ID' => 105,'zip_code' => 60003,'approved' => 0),
                array('ID' => 106,'zip_code' => 60001,'approved' => 0),
                array('ID' => 114,'zip_code' => 60007,'approved' => 0)
);

function removeNonApproved($var) {
    return $var['approved'];
}

function cmp($a,$b) {
    global $sortLike;
    return (array_search($a['zip_code'],$sortLike) < array_search($b['zip_code'],$sortLike) ) ? -1 : 1;
}

// Remove non approved items
$array1 = array_filter($array1,"removeNonApproved");

// Sort your array
usort($array1, "cmp");

var_dump($array1);

?>