次の変数$ 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 )
)
一意の値のみを含む2番目の配列$ secondを作成する必要があります。
配列(
[0] => stdClass Object ( [product_sku] => PCH20 ) [1] => stdClass Object ( [product_sku] => PCH19 )
)
しかし、$ rowsでarray_uniqueを実行すると、次のメッセージが表示されます。
キャッチ可能な致命的なエラー:クラスstdClassのオブジェクトをオンラインで文字列に変換できませんでした 191
$uniques = array();
foreach ($array as $obj) {
$uniques[$obj->product_sku] = $obj;
}
var_dump($uniques);
オプションの2番目のパラメーターsort_flagsを使用すると、次の値を使用してソート動作を変更できます。
タイプフラグの並べ替え:
- SORT_REGULAR-通常どおりアイテムを比較します(タイプを変更しないでください)
- SORT_NUMERIC-アイテムを数値で比較
- SORT_STRING-アイテムを文字列として比較します
- SORT_LOCALE_STRING-現在のロケールに基づいて、アイテムを文字列として比較します。
以下の変更点にも注意してください
5.2.10sort_flagsのデフォルト値をSORT_STRINGに戻しました。
5.2.9デフォルトのSORT_REGULARにオプションのsort_flagsが追加されました。 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;
}