2012-02-23 3 views
0

데이터베이스의 사용자 백분위 수를 계산하려고합니다. 이 작업을 수행하려면 배열을 정렬해야하는 $data 배열이 있어야합니다.PHP Int를 문자열로 Typecasting - 예상대로 작동하지 않습니다.

User_ID, Total_User_OrdersTotal_Orders을 포함하는 쿼리 개체가 있습니다. 다음 코드는 지금까지 보이는 방법은 다음과 같습니다

// Loop through the users 
foreach($query->result() as $row) 
{ 
    (string)$user_id = (string)$row->user_id; 

    $data[$user_id] = number_format((($row->total_user_orders/$row->total_orders)*100), 5); 
} 

// Sort the $data array 
array_multisort($data); 

print_r($data); 

(내가 믿는)해야 그 문자열로 $row->user_id (int를) 캐스트 무엇. 그런 다음 $data[$user_id] 색인을 문자열로 설정해야합니다. 맞습니까?

array_multisort을 사용하여 배열을 정렬 할 때 인덱스가 문자열이 아닌 Integer 인 것처럼 정렬합니다. 이것은 그것이 색인을 잃는다는 것을 의미합니다.

array_multisort()에 대한 PHP 설명서, "연관 (문자열) 키는 유지되지만 숫자 키는 다시 색인화됩니다.". 나는 또한 array_multisort($data, SORT_STRING)을 사용해 보았지만 동일한 출력이 발생합니다. 그러나 - 내가 $data['#'.$user_id]을 할 때 작동하지만 이것은 나에게 맞는 해결책처럼 느껴지지 않습니다!

아무도 도와 줄 수 있습니까? 미리 감사드립니다!

+1

사용자 ID별로 정렬하려고한다고 가정 할 때 '$ data'는 여기에서 다차원 적으로 보이지 않습니다. 왜'asort() '를 사용할 수 없습니까? http://www.php.net/manual/en/function.asort.ph –

+0

아니, 값으로 정렬하려고합니다 ('number_format ([...]) 등). 그러나 나중에 사용자 ID를 Percentile 값과 연결할 수 있도록 사용자 ID를 키로 유지하려고합니다. – Jack

+0

방금 ​​말한대로 ...'asort()'는 트릭을 잘 수행 한 것 같습니다! – Jack

답변

2

나는 당신이 과장되어 있다고 생각합니다. 어떤 시험으로,이 같은 $data -array 일하는 것이 색인 생각할 것 :

$data[(string)$row->user_id] = ... 

또는

$data[''.$user_id] = ... 

편집 :
그렇지 않으면 당신이 당신의 배열은 다차원 및 종류 만들 수있다 다음 중 하나를 사용하여 색인을 생성 할 수 있습니다.

foreach($query->result() as $row) { 
    $data[] = array(
    'user_id' => $row->user_id, 
    'percent' => number_format((($row->total_user_orders/$row->total_orders)*100), 5); 
); 
} 

또는 키에 의해 비율과 종류에 의해 (ksort() 사용) : 여러 사용자가 같은 비율이있는 경우

foreach($query->result() as $row) { 
    $data[number_format((($row->total_user_orders/$row->total_orders)*100), 5)] = $row->user_id]; 
} 

마지막 솔루션은 위험 할 수 있습니다.

개인적으로 나는 아마도 위에서 언급 한 asort() 해결책을 가지고 갈 것입니다.

+0

방금 ​​두 가지 제안을 시도했지만 여전히 똑같은 결과를 얻었습니다. 나는'print_r()'이 출력하고있는 것을 명확하게하기 위해 나의 질문을 편집 할 것이다. – Jack

+0

이 문제는 이미 기억하고 있기 때문에 작동하지 않을 것입니다. 그리고 키가 숫자 일 때 명시 적으로 문자열로 캐스팅하더라도 (즉, 잠시 동안 이후 재시험하지 않았다.) – rlanvin

+0

이 문제를 해결하기위한 더 많은 아이디어를 제공하기 위해 답을 업데이트했습니다. 최선의 특정 요구에 달려 있습니다. – Flygenring

1

내 의견에 설명 된대로 array_multisort()은 여기에있는 내용이 아닙니다. 다중 배열 또는 다차원 배열이 없습니다.

배열에 key => value 연관을 유지하고 내용을 정렬하려면 asort()을 사용하십시오.

foreach ($query->result() as $row) { 
    $percent = ($row->total_user_orders/$row->total_orders) * 100; 
    $data[$row->user_id] = number_format($percent, 5); 
} 
asort($data); 

내림차순 백분율을 정렬 한 후 reverse the array을 원하는 경우.

$data = array_reverse($data, true); 
관련 문제