2

我有一个在 PHP7 上运行但不在 PHP 5 中运行的 PHP 代码,这是我的服务器中的 PHP 版本,这是我的代码:

Array (
    [0] => stdClass Object (
        [userId] => 15
        [name] => name0
        [userName] => hh
        [centerName] => center10
    )

    [1] => stdClass Object (
        [userId] => 16
        [name] => name1
        [userName] => test
        [centerName] => center10
    )

    [2] => stdClass Object (
        [userId] => 1
        [name] => name2
        [userName] => ll
        [centerName] => center1
    )
)

$ids = array_unique(array_column($results, 'centerName'));
print_r($ids);

我得到了我在 PHP7 中的预期,但我在 PHP5 中得到了一个空数组。

如何调整我的代码以在 PHP5 中工作?

4

3 回答 3

3

手册一样,从php7.0 开始添加了使用对象数组作为参数的能力。array_column

在 php5 中,您根本无法使用array_column从对象数组中获取列。所以,你需要使用一些其他的代码,一个简单foreach的例子:

$uniqueValues = [];
foreach ($results as $item) {
    $uniqueValues[$item->centerName] = 1;
}
print_r(array_keys($uniqueValues));
于 2019-05-23T08:26:19.277 回答
1

在 array_column 的手册中,您可以获得如何在旧版本的 PHP 上使用array_column 遗留代码的代码。
我喜欢这种方法,因为它还包含第三个参数。

if (!function_exists('array_column')) {
    function array_column($array, $columnKey, $indexKey = null)
    {
        $result = array();
        foreach ($array as $subArray) {
            if (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                $result[] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
            } elseif (array_key_exists($indexKey, $subArray)) {
                if (is_null($columnKey)) {
                    $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                    $result[$index] = $subArray;
                } elseif (array_key_exists($columnKey, $subArray)) {
                    $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                    $result[$index] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
                }
            }
        }
        return $result;
    }
}

在您的情况下,代码将是上述代码,并且:

$ids = array_keys(array_column($results, 'name' ,'centerName'));
print_r($ids);

这将中心名称作为键和名称作为值,这意味着它将自动删除所有重复项,然后只需获取键。

Array_column 是您项目中的一个很好的功能。

于 2019-05-23T08:34:26.843 回答
1

我想我会提供另一种解决方案,尽管@u_mulder@Andreas提供的解决方案是很好的答案。

function new_array_column($input , $column_key, $index_key = null) {
    $result = array();
    array_walk($input, function($value, $key) use (&$result, $column_key, $index_key) {
        $result[empty($index_key) ? $key : is_object($value) ? $value->{$index_key} : $value[$index_key]]
        = empty($column_key) ? $value : (is_object($value) ? $value->{$column_key} : $value[$column_key]);
    });
    return $result;
}

这接受 newarray_column所做的所有参数,但通过使用array_walk.

代码看起来很糟糕,但它相当简单,但这里有一个简短的描述:

  1. 确定是否$index_key传递了一个,如果它现在设置了那个键,否则使用原始键。
  2. 检查是否$column_key指定了 a。
    2.1。如果没有$column_key通过,则使用整个值。
    2.2. 否则,使用该列中的值。

我已经在PHP 5.3.0上对此进行了测试,这是该代码可以使用的最早版本。(早期版本不接受函数中的匿名函数array_walk,它必须作为字符串传递)。

于 2019-05-23T09:10:19.790 回答