array_column()的替代方案(polyfill)

31
我在一个项目中使用了array_column()函数,上传后发现只有PHP 5.5或更高版本支持此函数,而我使用的主机不支持PHP 5.5或更高版本。
所以我想知道是否有任何替代方法来解决这个错误?
这是我在项目中使用array_column的方式:
array_count_values(array_column(json_decode(json_encode($queryResultArray), true), $idForBar));

这在我的本地XAMPP和WAMPP上运行得很好,但在服务器上出现了问题。正在寻找任何替代的函数或解决方案。

3
你确定要使用 json_decode(json_encode( 吗?为什么要这样做呢? - MightyPork
7
我会尽力为您翻译: "你知道我的解决方案是什么吗:升级 PHP 到 5.5,或者迁移到一个真正支持开发和进步的主机!" - Niet the Dark Absol
1
好的,把它分成几个部分,然后不要犹豫,直接去做。这并不复杂。 - Kevin
2
如果你需要一个库解决方案,可以访问 https://github.com/ramsey/array_column。 - Kevin
1
@MightyPork - 稍微有些hacky,有争议,但实际上非常高效。 - Mark Baker
显示剩余6条评论
6个回答

85

如果您的PHP版本不支持array_column函数,请添加您自己的函数:

<?php
if (! function_exists('array_column')) {
    function array_column(array $input, $columnKey, $indexKey = null) {
        $array = array();
        foreach ($input as $value) {
            if ( !array_key_exists($columnKey, $value)) {
                trigger_error("Key \"$columnKey\" does not exist in array");
                return false;
            }
            if (is_null($indexKey)) {
                $array[] = $value[$columnKey];
            }
            else {
                if ( !array_key_exists($indexKey, $value)) {
                    trigger_error("Key \"$indexKey\" does not exist in array");
                    return false;
                }
                if ( ! is_scalar($value[$indexKey])) {
                    trigger_error("Key \"$indexKey\" does not contain scalar value");
                    return false;
                }
                $array[$value[$indexKey]] = $value[$columnKey];
            }
        }
        return $array;
    }
}

参考资料:


8
你想知道你的实现与Ben Ramsey的 https://github.com/ramsey/array_column/blob/master/src/array_column.php 的区别。 - NBPalomino
1
最好将函数array_column()放在一个include文件中,并在代码顶部使用require。这样,只有在函数不存在时才会被包含。否则,如果函数已经存在,php会在解析时抱怨重定义。 - user603749
@user603749,已经有检查函数是否存在的代码了。 :) - Pupil
此外,如果您使用的是 PHP7+,则可以直接使用 array_column() 处理对象。您可以访问此链接:http://php.net/manual/en/function.array-column.php#refsect1-function.array-column-changelog - Blues Clues
这个函数在返回值为数组时无法正常工作。使用了@doub1ejack提出的解决方案,它完美地解决了问题。他的建议是使用PHP 5.5+库中的实际代码在此处 - Jeff
2
如果需要对象的支持,可以使用以下链接:https://www.php.net/manual/en/function.array-column.php#119754 - degers

24
你可以使用array_map()函数,如果你的PHP版本低于5.5而没有array_column()函数:
示例:
$a = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    )
);

array_column($a, 'last_name');

成为:

array_map(function($element) {
  return $element['last_name'];
}, $a);

所以在您的情况下,代码将是:

array_count_values(
  array_map(function($arr) use ($idForBar) {
    return $arr[$idForBar];
  }, $queryResultArray)
);

以上适用于PHP 5.3.0及以上版本!

如果你的PHP版本低于5.3.0,比如你使用的是PHP 5.2.17,只需使用简单函数:

function get_field_data($array, $field, $idField = null) {
    $_out = array();

    if (is_array($array)) {
        if ($idField == null) {
            foreach ($array as $value) {
                $_out[] = $value[$field];
            }
        }
        else {
            foreach ($array as $value) {
                $_out[$value[$idField]] = $value[$field];
            }
        }
        return $_out;
    }
    else {
        return false;
    }           
}

以及使用方法:

$output = get_field_data($queryResultArray, $idForBar);

这不仅是 array_column() 函数的功能。 - Alma Do
6
那又怎样?在这种情况下它是唯一所需的。 - Niet the Dark Absol

10

您也可以使用array_column()的替代代码,它很简单,只需粘贴以下行并替换您的变量即可。

代码:

array_map(function($element){return $element['last_name'];}, $a);

@Legionar在2014年提供了这个建议。你为什么要发布这个多余的回答呢? - undefined

4

你可以随时使用另一个函数实现array_column

if (!function_exists('array_column')) {
    function array_column(array $array, $columnKey, $indexKey = null)
    {
        $result = array();
        foreach ($array as $subArray) {
            if (!is_array($subArray)) {
                continue;
            } elseif (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                $result[] = $subArray[$columnKey];
            } elseif (array_key_exists($indexKey, $subArray)) {
                if (is_null($columnKey)) {
                    $result[$subArray[$indexKey]] = $subArray;
                } elseif (array_key_exists($columnKey, $subArray)) {
                    $result[$subArray[$indexKey]] = $subArray[$columnKey];
                }
            }
        }
        return $result;
    }
}

所以你拿了polyfill然后把trigger_errors给删掉了? - undefined

4

使用array_map()代替,类似这样:

array_count_values(
    array_map(
        function($value) use ($idForBar) {
            return $value[$idForBar];
        },
        json_decode(
            json_encode($queryResultArray),
            true
        )
    )
);

非常感谢您的回复,但在使用您的代码后,我遇到了另一个问题。 “语法错误,意外的T_FUNCTION,期望‘)’” 于是我在谷歌上搜索,发现匿名函数只支持5.3.0之后的版本? https://dev59.com/21DTa4cB1Zd3GeqPJoG7 如何解决这个问题? - Sizzling Code
你实际运行的是哪个版本的PHP?如果你得到了那个错误,它表明你使用的是一个非常老旧、不受支持的版本(PHP < 5.3),不支持闭包;在这种情况下,请阅读Niet对你问题的评论。 - Mark Baker
我刚刚使用 phpinfo(); 进行了检查,服务器上的 PHP 版本是 PHP Version 5.2.17 :( - Sizzling Code
先生,5.2.17 有任何解决方案吗? - Sizzling Code
如果您的 PHP 版本低于 5.3.0,正如您所写的 PHP 5.2.17 一样,只需使用简单函数即可,就像我更新的答案一样。 - Legionar

2

在“参见”部分,针对不支持array_colum()的PHP版本,有一个官方建议

» 推荐用于低于5.5版本的PHP的用户实现

他们的建议是另一种if (!function_exists('array_column'))方法,但代码实际上是从array_column库中提取的,并且比本页面上的示例更加通用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接