在PHP5中可以在PHP7中工作的代码有哪些替代方法

时间:2019-05-23 08:20:27

标签: php arrays function array-unique array-column

我有一个PHP代码可以在PHP7上运行,但不能在PHP 5上运行,而该服务器上的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?

3 个答案:

答案 0 :(得分:4)

manual起,自 php7.0 开始,就添加了使用对象数组作为array_column参数的功能。

在php5中,您只是不能使用array_column从对象数组中获取列。因此,您需要使用其他一些代码,例如简单的foreach

$uniqueValues = [];
foreach ($results as $item) {
    $uniqueValues[$item->centerName] = 1;
}
print_r(array_keys($uniqueValues));

答案 1 :(得分:1)

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

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在您的项目中非常有用。

答案 2 :(得分:1)

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

function myFind($input, $what) {
    if (!is_array($input)) {
        return $input->find($what);
    }
    $result = [];
    foreach ($input as $element) {
        $found = $element->find($what);
        foreach ($found as $f) $result[]=$f;
    }
    return $result;
}

and then call this like:

foreach(myFind($table, 'tr[class=portlet-table-alternate]') as $row) {
    //...
}

这将接受新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; } 所做的所有参数,但是通过使用array_column可以使其简洁明了。

该代码看上去很可怕,但是很简单,但这是一个简短的描述:

  1. 确定是否传递了array_walk(如果现在已设置了该密钥),否则请使用原始密钥。
  2. 检查是否指定了$index_key
    2.1。如果没有传递$column_key,则使用整个值。
    2.2。否则,请使用该列中的值。

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