我有一个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?
答案 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
可以使其简洁明了。
该代码看上去很可怕,但是很简单,但这是一个简短的描述:
array_walk
(如果现在已设置了该密钥),否则请使用原始密钥。$index_key
。$column_key
,则使用整个值。我已经在PHP 5.3.0上对此进行了测试,这是此代码可以使用的最早版本。 (早期版本在$column_key
函数中不接受匿名函数,必须将其作为字符串传递。)