2011-01-18 5 views
1

이름과 ID의 배열이 있습니다.가장 높은 값을 배열하거나 다음 값을 만드시겠습니까?

Array(
    0=>array(
     name=>New York, 
     id=>45763448349, 
     can=0 
    ), 
    1=>array(
     name=>New York2, 
     id=>45763464566, 
     can=0 
    ), 
    3=>array(
     name=>New York3, 
     id=>45763464854, 
     can=0 
    ), 
    4=>array(
     name=>New York4, 
     id=>45763464955, 
     can=0 
    ), 
    5=>array(
     name=>New York5, 
     id=>45763464745, 
     can=0 
    ), 
    6=>array(
     name=>New York6, 
     id=>45763464235, 
     can=1 
    ) 
) 

예를 들어 (다른 이름 (모든 뉴욕)이있을 것이다) 나는 이름을 가진 X 변수가 (예를 들어 X = 뉴욕) 내가 가장 높은 이름을 찾을 수 있습니다 무엇을해야하는지와 id를 얻은 다음 can이 1이면 그 다음으로 높은 이름을 지정하십시오.

예를 들어 내가 x = New York으로 가정하고 배열을 살펴보면 가장 높은 배열 이름이 New York6임을 알 수 있습니다. 나는 할 수있는 것을 본다. 그래서 나는 이드를 얻는다. 이제 할 수 있다면! = 1 그때 나는 특정한 뉴욕을 할 수 있었다.

참고 :이 배열은 많은 서로 다른 값을 포함합니다 이제 어떻게이 땅에서 나는 심지어 시작하는 것

(모든 뉴욕, 난 그냥 예를 들어 그 사용)? 이 같은

+0

최고 이름 :

$ar = array_filter($ar, function($el) { $search = 'New York'; $name = $ar['name']; $potentialNumber = substr($name, strlen($search)); return ((substr($name, 0, strlen($search)) == $search) && // starts with NY ($potentialNumber == '' || is_numeric($potentialNumber)); // [0-9]* }); // $ar contains only 'New York' and 'New York6' now 

지금, 당신은 어떤 usort으로 정렬 및 첫 번째 요소를 선택해야합니까? 다른 말로? 또한 "뉴욕", "뉴욕 2"등은 문자열이라고 생각합니다. 그래서 그들을 '' '옆에 놓으십시오. – Shoe

+1

빠른 질문 ... 가장 높은 이름으로 문자열 비교에서 가장 높은 값을 의미합니까, 아니면 가장 높은 숫자입니까? 예 :"New York2"는 "New York12"보다 "높은"문자열이지만 숫자 12는 분명히 2보다 높습니다. 어떤 해석을 찾고 계십니까? 또는 조합? 예 : "Denver1", "Denver2", "Chicago1", "Chicago2", "Chicago3" "Denver2"를 확인한 다음 "Denver1"문자열이 "Chicago"보다 높기 때문에 먼저 검사하십시오 –

+0

찾고 있습니다. 그 이름의 가장 높은 문자열 비교 (문자열 비교) 그래서 뉴욕을 찾고 있다면 뉴욕 .6 만약 내가 Bob을 찾고 있다면 The Giant는 무엇인지 등등. – Steven

답변

0

작업을 작은 것으로 나누십시오. 첫 번째 필터 기준은 can=1 인 것 같습니다. array_filter으로 확인해 봅시다.

$ar = array(array('name'=>'New York', 'id'=>45763448349, 'can'=>1), array('name'=>'New York2', 'id'=>45763464566, 'can'=>0), array('name'=>'New York3', 'id'=>45763464854, 'can'=>0), array('name'=>'New York4', 'id'=>45763464955, 'can'=>0), array('name'=>'New York5', 'id'=>45763464745, 'can'=>0), array('name'=>'New York6', 'id'=>45763464235, 'can'=>1), array('name'=>'New Yorkistan', 'id'=>0, 'can'=1)); 
$ar = array_filter($ar, function($el) {return $el['can'];}); 
// Now $ar contains the entries 'New York', 'New York2', and 'New Yorkistan' 

이제 New York (및 번호)과 일치하지 않는 항목을 필터링하여 제거하십시오.

usort($ar, function($el1, $el2) { 
    $id1 = $el1['id']; $id2 = $el2['id']; 
    if ($id1 == $id2) return 0; 
    return $id1 < $id2 ? 1 : -1; 
}); 
if (count($ar) > 0) { 
    $result = $ar[0]; 
} else { 
    // Nothing matched your criteria 
} 
+0

어떻게이 사전을 할 수 있습니까 5.3? – Steven

+0

@Steven 함수의 모든 인스턴스를 create_function으로 대체하십시오 (php.net/manual/en/function.create-function.php 참조). 예를 들어, 최종 함수는 다음과 같습니다. create_function ('$ el1, $ el2', 'return $ id1 <$ id2? 1 : -1') – phihag

0

뭔가 :

//$my_array is your array of values 
//$string = 'New York'; your search term 
$id = false; 
for($i = count($my_array) - 1; $i >= 0; $i++) { 
    if($id === false) { 
     if(strpos($my_array[$i]['name'], $string) !== false && $my_array[$i]['can'] == 1) { 
      $id = $my_array[$i]['id']; 
     } 
    } 
} 
//Insert it if no id was found 
if($id === false) { 
    $id = 'something'; 
    $can = 1; 
    array_push($my_array, array('name' => $string, 'id' => $id, 'can' => $can)); 
} 

는 그 일을합니까?

편집 코드에서

+0

그것은 서로 다른 문자열 일 수 있습니다. 여기서 $ string은 항상 'New York'이라고 가정합니다. – Shoe

+0

@Charlie - 예, 그가 찾고있는 것을 보여줍니다. 그것은 내가 설정 한 임의의 문자열 일뿐입니다. 나는 그의 예에서 사용했던 'New York'을 사용했기 때문에 ... –

+0

예, 배열은 array (0 => array ('name'=> 'New York1'), 1 => array 'name'=> 'San Francisco 123')); – Shoe

2

(경우는, $string 당신이 찾고있다 무엇 이건 분명 아니에요) :

function city_cmp($record_a, $record_b) { 
    return strcmp($record_a["name"], $record_b["name"]; 
} 

usort($cities, 'city_cmp'); 
end($cities); 
$city = current($cities); 
do { 
    if ($city["can"] === 1) { 
     $can_city = $city; 
     break; 
    } 

} while ($city = prev($cities)); 

참고 : 선택적으로, 당신은 break를 건너 뛰고 $can_city 부분을 만들 수 너의 상태의. 일부는 루프 종료 조건을 명확하게 만들 수 있으므로이를 선호합니다. 빠른 단계에서

: 당신은 캔 = 1을 찾을 때까지

  1. usort() 배열

  2. 사용 end() 배열의 끝에 가리키고 prev()합니다.

1

다차원 배열이므로 ($ array라고 부름) 관련 데이터를 찾으려면 루프를 반복해야합니다.

$highest_id = array('id' => 0, 'count' => 0, 'can' => 0); 
for each ($array AS $key => $data) 
{ 
    if (substr($data['name'],0,strlen($x)) == $x) 
    { 
    $current_count = (int) substr($data['name'],strlen($x)); 
    if ($current_count > $highest_id['count']) 
    { 
     $highest_id = array('id' => $data['id'], 'count' => $current_count, 'can' => $data['can']); 
    } 
    } 
} 
if ($highest_id['can'] == 1) 
{ 
    $id = $highest_id['id']; 
} 
else 
{ 
// can is not 1 => specify new $x 
} 
+0

이것은 속임수가 아닌 간단한 스케치입니다. 이것이 당신을 위해 작동하는 것처럼 보이는 경우 번호가 붙어 있지 않은 단지 "뉴욕"과 같은 마음의 사건을 기쁘게하십시오. – Paul

+0

문자열을 정수로 설정하여 'New York2'를 '2'로 변환 할 수도 있습니다. 예 : "settype ($ string, 'int');". 정수가없는 '뉴욕'사례를 관리하는 데 유의하십시오. – Shoe

관련 문제