2016-05-28 1 views
0

私はmysqli_resource(mysqli_queryから返されたもの)と特定の列を引数に取り、それを線形PHP配列として返す関数が必要でした。これは今私が持っているものです:PHP:この機能をより効率的にする方法はありますか? resourceToOneDimensionalArray(リソースを1次元配列に)

function resourceToOneDimensionalArray($resource, $field) { 
    if($resource == false) return false; 
    if(is_array($resource)) { 
    if(is_array($resource[0])) { 
     $output = array(); 
     foreach($resource as $row) { 
      array_push($output, $row[$field]); 
     } 
     return $output; 
    } 
    else { 
     return $resource; // already a 1D array, return it 
    } 
    } 
    $array = array(); 
    while($row = mysqli_fetch_array($resource)) { 
    array_push($array, $row[$field]); 
    } 

    return $array; 
} 

私はこれを行うPHP関数について聞いたことがありますが、私はドキュメントで見つけることができません。検索に失敗したか、ドキュメント自体を誤解しているのか、組み込み関数を夢見ているのかはわかりません。

この機能が有効な場合は、それほど優れている場合もあります。コードをスピードアップしようとしています。

+0

なぜ 'if(is_array($ resource))'が真であるべきですか?何らかの理由で配列**または** mysqliリソースになる可能性のある変数を扱いますか? –

+0

正に、私はコードの52の関数のインスタンス化をチェックしなければならないでしょう。あなたは、小切手がそれを大幅に減速させるかもしれないと思われますか? – Bing

+0

いいえ、関数呼び出しごとに1つの小さなif条件しかありません。パフォーマンスに大きな影響はありません。私はリソースがいついつ期待されるのか疑問に思った。結果リソースの1つのフィールドをフィルタリングしています。 mysqli_fetch_allでホールテーブルを取得する前にSQLクエリを変更する方法はないと思いますか?そして、「効率的な」という意味は何ですか?パフォーマンスまたはメモリ消費? –

答えて

0

array_pushは(少なくとも以前のPHPバージョンでは、まだPHP7でプロファイリングされていない)直接配列要素アクセスよりも遅いため、インデックスのインクリメントによってメモリ消費に影響を与えることはありませんでした。

$array = array(); 
$idx = 0 
while($row = mysqli_fetch_array($resource)) { 
    $array[$idx++] = $row[$field]); 
} 

あなたはメモリ消費を気にしない場合は

$array = array(); 
while($row = mysqli_fetch_array($resource)) { 
    $array[] = $row[$field]); 
} 

に大きな差がある場合にも、プロファイルができますが、mysqli_fetch_allで完全な表を一度フェッチと行配列を反復処理することができその1つのフィールドを選択します。

一般に、最適化されていないコンパイルとはCPUのレジスタをスタックにプッシュし、サブルーチンの実行後にプルすることを意味するため、特にループ内での関数呼び出しを避けることで、PHPやその他の多くの言語でパフォーマンスを向上させることができます。

mysqliには、すでに実行されたクエリから単一の列をフェッチする方法はありません。

関連する問題