1

私は配列を持っています

$users    = array();

$users[0]['id']=1;
$users[0]['name']="user1";

$users[1]['id']=2;
$users[1]['name']="user2";

$users[2]['id']=3;
$users[2]['name']="user3";

そして、ID を別の配列 $ids; に抽出する必要があります。そのような

$ids[0]=1;
$ids[1]=2;
$ids[2]=3;

私はそれを行う1つの方法を知っています...

$ids    = array();
foreach($users as $user){
   $ids[]  = $user['id'];
}

しかし

1.それは最善の方法ですか?2.ループなしでそれを行うことは可能ですか。3.それは最速の方法ですか....?

4

2 に答える 2

2

上記のすべてのコメントは質問に非常によく対応していますが、実際の回答を実際に投稿した人は誰もいないため、ここにいくつかの追加情報があります(私の回答を正当化するため):

  • それはそれを行うための最良の方法ですか?

おそらく、しかしそれは確かにそれを行うためのよりクリーンで最も読みやすい方法です

  • ループなしでそれを行うことは可能ですか?

はい、しかし、人々が言っ​​たように、バックグラウンドでループが使用されるため、これはトリックにすぎません。

  • それは最速の方法ですか?

これには調査が必要です。100000 エントリを使用して、あなたと同様の配列を再作成しました。

for ($i=0;$i<100000;$i++) {
    $users[] = array('id' => rand(),
            'name' => 'default');
}

そして、さまざまなケースを使用していくつかのテストを実行しました。

1.単純な for ループ (自分で使用したもの):

$ids=array();
$t = microtime(true);
foreach ($users as $key => $value) {
    $ids[] = $value['id'];
} 
echo microtime(true)-$t;

これには、平均で 0.085 インチが必要でした

2.array_walk() の使用:

$t = microtime(true);
array_walk($users, create_function('$v,$k,&$ids', '$ids[0][] = $v["id"];'), array(&$ids));
echo microtime(true)-$t;

これには平均 0.22 インチが必要でした (この「参照」ハックの代わりに $GLOBALS['ids'] を使用した場合も同じです)。

3.splFixedArray の使用: このイテレータは、単純な配列よりも高速であると想定されています。実際、上記のコードには平均で 0.075 インチが必要です。

$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) {
    $users[$i] = array('id' => rand(),
            'name' => 'default');
}
$ids=array();
$t = microtime(true);
foreach ($users as $key => $value) {
    $ids[$key] = $value['id'];
}
echo microtime(true)-$t;

両方の配列に splFixedArray を使用する以下のコードは、約 0.062 インチでさらに高速に実行されます。

$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) {
    $users[$i] = array('id' => rand(),
            'name' => 'default');
}
$ids=new SplFixedArray(100000);
$t = microtime(true);
foreach ($users as $key => $value) {
    $ids[$key] = $value['id'];
}
echo microtime(true)-$t;

つまり、結論としては、最速の方法ではありませんが、最初の質問で提示した 3 つのパラメーターすべてを考慮に入れるのが最善の方法です。

于 2012-08-06T08:45:19.037 に答える
0
  • 最良の方法は、プログラマーとしてのあなたのやり方だと思います (ただし、チームにいる場合、最良の方法はチームのやり方です)。
  • パフォーマンスの問題については、組み込みの PHP 関数 (一部の関数を除く) に永遠に依存することになると思います (PHP ピアは、それを改善するために必要に応じて一生懸命働いていると思います)。
  • ループなしでそれを行うことは可能だと思います。
$users = 配列();
$users[0]['id'] = 100;
$users[1]['id'] = 101;
$users[2]['id'] = 102;

$ids = 配列();
array_walk_recursive($users, function($val, $key) use(&$ids){
    if ($key == 'id') $ids[] = $val;
});

print_r($ids);


配列
(
    [0] => 100
    [1] => 101
    [2] => 102
)
于 2012-08-06T13:08:09.137 に答える