2012-10-19 6 views
4

루프를 반환 할 수 있습니까? 결과가 아니라 루프 자체. PHP에서 함수를 만들고 싶습니다. 예를 들면 다음과 같습니다.함수에서 루프 반환

function myloop($sql){ 
$query = mysql_query($sql); 

return while(mysql_fetch_assoc($query)) 
} 

내가 이것을 만들고 싶은 이유는 코드 반복을 피하기 위해서입니다. 누구든지 나를 도울 수 있습니까? 감사합니다 ..

+6

왜 downvotes? 좋습니다. 질문은 최고의 품질은 아니지만 좋은 의도가 있습니다. 코드 중복을 줄입니다. 그 아이디어는 좋지 않았지만이 질문은 많은 사람들에게도 발생할 수 있다고 생각합니다. 그리고 그것에 대한 좋은 대답을 제공하는 것은 미래에 유익 할 수 있습니다. – ppeterka

+0

@ppeterka 동의 – GolezTrol

+0

@GolezTrol 우리는 우리의 마음에 같은 것을 보았습니다. :) – ppeterka

답변

3

아니요, 불가능합니다. 대신, 이름으로 기능을 전달하는

// The myloop function, with another name. 
function query($sql, $rowcallback) 
{ 
    $query = mysqli_query($sql); // use mysqli, not mysql 
    while 
    (($row = mysql_fetch_assoc($query)) && 
     call_user_func($rowcallback, $row)); 
} 

// The code to process a row. 
function processRow(array $row) 
{ 
    // Use your row here.. 
    var_dump($row); 

    return true; // You can return false to break processing. 
} 

//calling: 
query($yourSelf, 'processRow'); 

을 당신은 또한 당신의 PHP 버전에 따라, 익명 함수를 사용할 수 있습니다 : 당신은하지만, 함수에 함수를 전달할 수있다

//calling: 
query($yourSelf, 
    function(array $row) 
    { 
    var_dump($row); 
    return true; // You can return false to break processing. 
    }); 

기능 호출 수신자로부터 호출되는 호출은 종종 콜백이라고합니다. call_user_func은 콜백을 호출하는 가장 좋은 방법이기 때문에 함수뿐만 아니라 메서드와 정적 메서드도 받아 들일 수 있으므로 더 유연하게 사용할 수 있습니다.

+0

내가 5 개 항목을 너무 표시했다면 이것을 구현할 수있는 간단한 예제를 제공 할 수 있습니까? 고마워요 :) – thenewbie

+0

얼마나 많은 항목이 중요하지 않습니다. 함수는 각 행에 대해 개별적으로 호출됩니다. – GolezTrol

+0

루프를 수정 했으므로 false를 반환하여 데이터 집합 처리를 중단 할 수 있습니다. – GolezTrol

1

아니요, 아닙니다.

a function을 반환하면 아무 것도 실행하지 않고 루프를 실행할 수 있지만 루프 자체는 반환 할 수 없습니다.

1

번호

당신은, 예를 들어, 루프를 포함 할 수있는 익명 함수를 반환 할 수 있지만, 당신은 단지 기능이 아닌 언어 구조에서 을 반환 할 수 있습니다.

5

아니요.하지만 오늘부터 안정 버전으로 PHP를 Iterator으로 시뮬레이션 할 수 있습니다. PHP 5.5에서는 발전기가 가까이에 있습니다.

$lazyQuery = new SqlResultItertor($sql); 
foreach ($lazyQuery as $assoc) { 
    $assoc; # the result, one per row 
} 

은 BTW : PDOMySqli 제공이 이미 상자 중 (안 게으른 쿼리,하지만 결과에 이동입니다), mysql을 위해 당신은 반복자-결과가 자신의 객체를 작성해야합니다.

mysql_* 기능 관련 코드는 this answer을 참조하십시오. 그러나 오늘날의 일반적인 제안은 PDO 나 mysqli를 대신 사용하는 것입니다. How to successfully rewrite old mysql-php code with deprecated mysql_* functions?

+0

나는 이것을 시도 할 것입니다. 나는 mysql에 익숙하다. 하지만 팁을 주셔서 감사합니다. – thenewbie

+0

@thenewbie : 도움이 될만한 내용이 있습니다. http://www.php.net/manual/en/mysqli.quickstart.dual-interface.php - 질문에 대한 이점은 있지만, 당신은 객체 지향 인터페이스를 원한다. Mysqli와 PDO는 많은 코드를 작성하지 않도록 도와 줄 것입니다. – hakre

1

을 참조하십시오.

대신 루프를 반환하는 당신이 그것을 Variable functions를 사용하여이 방법으로 할 수 : 사시와

function myloop($sql, $myFunction){ 
    $query = mysql_query($sql); 
    while(mysql_fetch_assoc($query)) { 
     $myFunction($result); 
    } 

} 


function doSomethingWithTheResult($result) { 
    echo $result; // just to have something here... 
} 

//now the usage: 
myloop("SELECT 1", 'doSomethingWithTheResult'); 

을, 이것은 Template method OOP 디자인 패턴의 개념과 유사하다.

1

아니,하지만 당신은 그러나

function loopdate($sql,$code) 
{ 
$query=mysql_query($sql) 
while (mysql_fetch_assoc($query)) 
{ 
    eval($code); 
} 
} 

을 할 수 - 평가는 정말 정말 실망 rediculously 위험합니다.

function loopdate($sql,$function) 
{ 
$query=mysql_query($sql) 
while ($data=mysql_fetch_assoc($query)) 
{ 
    $function($data); 
} 
} 

이 더 좋을 것입니다.PHP는 것이 가능 5.5 이상에서

myfunc($data) 
{ 
foreach ($data as $key->$value) 
{ 
    print "<tr><td>".$key."<td><td>".$value."</td></tr>\n"; 
} 
} 

그래서 당신은 (이것은 generator라고합니다) return 대신 yield 키워드를 사용하여,

loopdate("select * from mytable","myfunc"); 
+0

감사합니다. 어떻게 내가 10 또는 5 항목을 표시했다면 이것을 구현할 수 있습니까? :) – thenewbie

+0

예를 들어 – BugFinder

+0

으로 업데이트되었습니다. – thenewbie

0

를 호출 할 수

function myloop($sql) { 
    $query = mysql_query($sql); 
    while (($row = mysql_fetch_assoc($query))) { 
     yield $row; 
    } 
} 

foreach (myloop('SELECT * FROM foo') as $row) { 
    // do something with $row 
} 

이가 구형 PHP에서 반복자로 할 수 있었던 것과 많이 다르지 않지만 코드는 훨씬 깔끔하다.