Ответ 1
$uniques = array();
foreach ($array as $obj) {
$uniques[$obj->product_sku] = $obj;
}
var_dump($uniques);
У меня есть следующая переменная $rows:
Массив (
[0] => stdClass Object ( [product_sku] => PCH20 ) [1] => stdClass Object ( [product_sku] => PCH20 ) [2] => stdClass Object ( [product_sku] => PCH19 ) [3] => stdClass Object ( [product_sku] => PCH19 )
)
Мне нужно создать второй массив $second, содержащий только уникальные значения:
Массив (
[0] => stdClass Object ( [product_sku] => PCH20 ) [1] => stdClass Object ( [product_sku] => PCH19 )
)
Но когда я запускаю array_unique в $rows, я получаю:
Допустимая фатальная ошибка: объект класса stdClass не может быть преобразован в строку в строке 191
$uniques = array();
foreach ($array as $obj) {
$uniques[$obj->product_sku] = $obj;
}
var_dump($uniques);
Необязательный второй параметр sort_flags может использоваться для изменения поведения сортировки с использованием следующих значений:
Флаги типа сортировки:
- SORT_REGULAR - обычно сравнивайте элементы (не меняйте типы)
- SORT_NUMERIC - сравнить элементы численно
- SORT_STRING - сравнить элементы как строки
- SORT_LOCALE_STRING - сравнить элементы как строки, основанные на текущей локали.
Также обратите внимание на изменения ниже
5.2.10 Изменено значение по умолчанию sort_flags обратно в SORT_STRING.
5.2.9 Добавлен необязательный sort_flags, по умолчанию - SORT_REGULAR. До 5.2.9 эта функция используется для сортировки массива с SORT_STRING внутри.
$values = array_unique($values, SORT_REGULAR);
Поведение функции array_unique()
по умолчанию - сначала обрабатывать значения внутри строки. Итак, что происходит, так это то, что PHP пытается превратить ваши объекты в строки (что бросает ошибку).
Вы можете изменить свой вызов функции следующим образом:
$uniqueArray = array_unique($rows, SORT_REGULAR);
Это будет сравнивать значения без изменения их типа данных.
Пожалуйста, проверьте код ниже, я надеюсь, что это будет полезно для вас.
$resultArray = uniqueAssocArray($actualArray, 'product_sku');
function uniqueAssocArray($array, $uniqueKey)
{
if (!is_array($array))
{
return array();
}
$uniqueKeys = array();
foreach ($array as $key => $item)
{
$groupBy=$item[$uniqueKey];
if (isset( $uniqueKeys[$groupBy]))
{
//compare $item with $uniqueKeys[$groupBy] and decide if you
//want to use the new item
$replace= false;
}
else
{
$replace=true;
}
if ($replace)
$uniqueKeys[$groupBy] = $item;
}
return $uniqueKeys;
}