在 PHP5 中 PHP7 中可以使用的替代代码
What alternative of code that work in PHP7 in PHP5
我有一个 PHP 代码在 PHP7 上运行但在 PHP5 上不运行,我服务器中的 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 中工作?
从 manual 开始,添加了使用 对象数组 作为 array_column
参数的功能,因为 php7 .0.
在 php5 中,您只需 不能 使用 array_column
从对象数组中获取列。所以,你需要使用一些其他代码,一个简单的 foreach
例如:
$uniqueValues = [];
foreach ($results as $item) {
$uniqueValues[$item->centerName] = 1;
}
print_r(array_keys($uniqueValues));
在 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 是您项目中的一个很棒的功能。
我想我会提供另一种解决方案,尽管 @u_mulder and @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;
}
它接受新 array_column
所做的所有参数,但通过使用 array_walk
.
保持美观和简洁
代码看起来很糟糕,但它相当简单,但这里有一个简短的描述:
- 判断是否通过了
$index_key
,如果通过则现在设置那个key,否则使用原来的key。
- 检查是否指定了
$column_key
。
2.1.如果没有传递 $column_key
,则使用整个值。
2.2.否则,使用该列中的值。
我已经在 PHP 5.3.0 上对此进行了测试,这是此代码可以运行的最早版本。 (早期版本不接受array_walk
函数中的匿名函数,它必须作为字符串传递)。
我有一个 PHP 代码在 PHP7 上运行但在 PHP5 上不运行,我服务器中的 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 中工作?
从 manual 开始,添加了使用 对象数组 作为 array_column
参数的功能,因为 php7 .0.
在 php5 中,您只需 不能 使用 array_column
从对象数组中获取列。所以,你需要使用一些其他代码,一个简单的 foreach
例如:
$uniqueValues = [];
foreach ($results as $item) {
$uniqueValues[$item->centerName] = 1;
}
print_r(array_keys($uniqueValues));
在 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 是您项目中的一个很棒的功能。
我想我会提供另一种解决方案,尽管 @u_mulder and @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;
}
它接受新 array_column
所做的所有参数,但通过使用 array_walk
.
代码看起来很糟糕,但它相当简单,但这里有一个简短的描述:
- 判断是否通过了
$index_key
,如果通过则现在设置那个key,否则使用原来的key。 - 检查是否指定了
$column_key
。
2.1.如果没有传递$column_key
,则使用整个值。
2.2.否则,使用该列中的值。
我已经在 PHP 5.3.0 上对此进行了测试,这是此代码可以运行的最早版本。 (早期版本不接受array_walk
函数中的匿名函数,它必须作为字符串传递)。