1

我有一个要从中转换的数据库记录数组:

array(2) {
  [0]=>
  array(1) {
    ["ID"]=>
    string(1) "2"
  }
  [1]=>
  array(1) {
    ["ID"]=>
    string(1) "3"
  }
}

对此:

array(2) {
  [0]=>
    string(1) "2"
  [1]=>
    string(1) "3"
}

我正在寻找性能最快/最简单的解决方案。

我找不到任何 PHP 函数。

4

5 回答 5

4

在 PHP 5.5 或更高版本上,最简单的解决方案是使用 PHP 的内置array_column()函数。

$ids = array_column($arr, 'ID');
于 2013-08-23T00:33:58.773 回答
3
$bas = array();
foreach ($foo as $bar) {
    $bas[] = $bar['ID'];
}

print_r($bas);

您将在哪里$foo原始数组以及$bas您想要将其转换为的数组。

于 2013-08-22T21:40:46.847 回答
3

我编写了简单的测试来找到这些之间的最佳解决方案:

// foreach
foreach ($array as $element) { $result[] = $element['ID']; }
// array_map
array_map(function($element) { return $element['ID']; }, $array);
// array_push
foreach ($array as $element) { array_push($result, $element['ID']); }

结果:

Test name   Repeats         Result          Performance    
foreach     1000            0,009204 sec    +0% 
array_push  1000            0,015731 sec    -70,915%
array_map   1000            0,024891 sec    -170,437%

它们有时会略有不同,但foreach始终是最好的,具有出色的性能结果。所以,似乎@campari 的答案必须是最佳答案。但我没有测试@kba 解决方案,因为我使用的是 PHP 5.4。我怀疑该array_column算法会显示出更好的结果。

测试代码在这里:链接

于 2013-08-23T01:44:38.357 回答
2

您的输入数据(丰富了其他数据类型,-用于测试-)并假设您使用的是最新的 PHP 版本:

$input = array(
    0=>
    array(
        "ID"=>  "2"
    ),
    1=>
    array(
        "ID"=>  "3"
    ),
    "iamnotanarray", 100, null
);

示范:

$out = array_map( function($el){ return @current($el);}, $input);

一般来说:

$out = array_combine(
    array_keys($ret)
    ,array_map( function($el){ return @current($el);}, $ret)
)

输出:

var_export($out);

array (
    0 => '2',
    1 => '3',
    2 => NULL,
    3 => NULL,
    4 => NULL,
)

var_dump($out);

array(5) {
  [0]=>
  string(1) "2"
  [1]=>
  string(1) "3"
  [2]=>
  NULL
  [3]=>
  NULL
  [4]=>
  NULL
}

要过滤可能不需要的数据类型,您可以使用:

$out = array_filter($out, is_string);
var_dump($out);
array(2) {
  [0]=>
  string(1) "2"
  [1]=>
  string(1) "3"
}

我没有计时(还没有),但这是使用PHP 的本机预编译函数。速度随 PHP 可执行文件的 gcc 编译器优化而变化。

注意: @current很脏,不推荐,仅用于简洁/可读性。它会产生与is_array($el) ? current($el) : NULL;

于 2013-08-23T00:24:03.473 回答
1

尝试这个-

$newArr = array();
foreach($array as $a)  // $array is original array 
{
    array_push($newArr, $a["ID"]);
}
print_r($newArr);
于 2013-08-22T21:41:54.910 回答