Какая альтернатива коду, который работает в PHP7 в PHP5 - PullRequest
2 голосов
/ 23 мая 2019

У меня есть код 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 ]

3 голосов
/ 23 мая 2019

Начиная с manual , добавлена ​​возможность использовать массив объектов в качестве параметра для array_column, поскольку php7.0 .

В php5 вы просто не можете использовать array_column для получения столбцов из массива объектов.Итак, вам нужно использовать какой-то другой код, например foreach:

$uniqueValues = [];
foreach ($results as $item) {
    $uniqueValues[$item->centerName] = 1;
}
print_r(array_keys($uniqueValues));
1 голос
/ 23 мая 2019

Я думал, что предложу другое решение, несмотря на то, что решения @ 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;
}

Принимает все параметры, которые делает новый array_column, но сохраняется аккуратно и кратко с помощью array_walk.

Код выглядит ужасно, но он довольно прост, но вот краткое описание:

  1. Определите, был ли передан $index_key, если ему тогда был задан этот ключ, в противном случае используйте исходный ключ.
  2. Проверьте, был ли указан $column_key.
    2.1. Если $column_key не передано, используйте полное значение.
    2.2. В противном случае используйте значение из этого столбца.

Я проверял это на PHP 5.3.0 , который является самой ранней версией, с которой будет работать этот код. (Более ранняя версия не принимает анонимную функцию в функции array_walk, она должна быть передана в виде строки).

1 голос
/ 23 мая 2019

В руководстве к array_column вы можете получить код о том, как использовать устаревший код array_column в старых версиях PHP.
Мне нравится этот метод, так как он также включает третий параметр.

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 - отличная функция для вашего проекта.

...