【问题标题】:array_column returning 0 results from an array with dataarray_column 从包含数据的数组返回 0 结果
【发布时间】:2016-07-07 17:28:48
【问题描述】:

我有一些数据进入具有多行和多列的页面。我特别想取一整列并将其放入另一个数组中。

我正在使用 codeigniter 和 php。我页面上的 var 转储显示其原始数组中的数据正常到达。但是一旦我开始尝试在页面上创建第二个数组,该数组返回 0 个结果。

这是原始数组的 var_dump。为了您的理智,我只发布第一个序列。

array(7) { [0]=> object(stdClass)#19 (7) { ["id"]=> string(1) "1"
["serial_number"]=> string(9) "电池 1" ["battery_type"]=> string(4) "Lipo" ["cell_count"]=> 字符串(1) "4" ["容量"]=> 字符串(4) "16.8" ["date_submitted"]=> 字符串(19) "0000-00-00 00:00:00" ["user_id_submitted"]=> 字符串(0) "" } [1]=>

这里是 array_column 函数

<?php 
    $serialnumber = array_column($batteryDb, "serial_number");
    var_dump($serialnumber);
?>

结果如下:

array(0) { }

【问题讨论】:

  • 嗯,看来$batteryDb 的结构不正确。它必须是一个数组数组。您能否将var_dump($batteryDb); 的输出添加到您的原始帖子中 - 可能只有两个项目。
  • @JustinSellers 编辑您的 OP 以包含您的样本数组数据。
  • 我刚刚为你更新了。

标签: php mysql arrays codeigniter


【解决方案1】:

好的,var_dump($batteryDb); 显示了这个:

array(7) { 
 [0] => object(stdClass)#19 (7) {                     <----- object  !!
    ["id"]=> string(1) "1" 
    ["serial_number"]=> string(9) "battery 1" 
    ["battery_type"]=> string(4) "Lipo" 
    ["cell_count"]=> string(1) "4" 
    ["capacity"]=> string(4) "16.8" 
    ["date_submitted"]=> string(19) "0000-00-00 00:00:00" 
    ["user_id_submitted"]=> string(0) "" }
 [1] =>

问题是这个数组结构不适用于 PHP5 上的array_column

您有一个对象数组,但该函数需要一个数组数组。

array_column 上的对象数组仅受 PHP7 支持。 参考:https://github.com/php/php-src/blob/PHP-7.0.0/UPGRADING#L626


基本的解决方案是将你的对象变成数组:

array(7) { 
     [0] => array (7) {                              <----- array !!
        ["id"]=> string(1) "1" 

你可以这样做:

  • $array = (array) $object;
  • $array = get_object_vars($object);
  • 如果是多维的:$array = json_decode(json_encode($object), true);

试试这个:

$batteryDbArray = json_decode(json_encode($batteryDb), true);

$serial_numbers = array_column($batteryDbArray, 'serial_number');
var_dump($serial_numbers);

【讨论】:

  • 好的,所以我试了一下。它渲染了这个数组(7){[0]=>字符串(9)“电池1”[1]=>字符串(9)“电池2”[2]=>字符串(9)“电池3”[3] => 字符串(9)“电池 5”[4]=> 字符串(9)“电池 6”[5]=> 字符串(9)“电池 4”[6]=> 字符串(9)“电池 7”}
  • 现在要弄清楚如何将它们放入下拉列表中。哈哈
【解决方案2】:

我认为array_column 仅在 7.0 中添加了对 Objects 数组的支持,因此您可以尝试升级 PHP 或使用其他方法。

试试array_map:

$serial_numbers = array_map(function($e) {
  return is_object($e) ? $e->serial_number : $e['serial_number'];
}, $batteryDb);

还有其他更糟糕的解决方案,例如使用json_encode(json_decode()) 或使用get_object_vars 或强制转换迭代将stdClass 转换为array 对象的数组,但我认为这些增加了不必要的开销并且不太明显:

$serial_numbers = array_column(json_decode(json_encode($batteryDb), true), 'serial_number'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2019-05-06
    • 2010-12-05
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多