2016-11-30 4 views
-1

Так что у меня этот объект:array_diff_assoc() аргумент # 1 не является PHP массив

[ 
    { 
     "id":1, 
     "name":"create-users", 
     "display_name":"Create user", 
     "description":"Add new user" 
    }, 
    { 
     "id":2, 
     "name":"edit-user", 
     "display_name":"Edit user", 
     "description":"Edit existing user" 
    }, 
    { 
     "id":3, 
     "name":"create-post", 
     "display_name":"Create post", 
     "description":"create new post" 
    }, 
    { 
     "id":4, 
     "name":"edit-post", 
     "display_name":"Edit post", 
     "description":"edit existing post" 
    } 
] 

и это еще один:

[ 
    { 
     "id":3, 
     "name":"create-post", 
     "display_name":"Create post", 
     "description":"create new post" 
    }, 
    { 
     "id":4, 
     "name":"edit-post", 
     "display_name":"Edit post", 
     "description":"edit existing post" 
    } 
] 

Теперь я зацикливание через эти два объекта в гнездовой Еогеасп loops top сравнивают, какие массивы из двух объектов равны (равные пары ключей и значений).

Вот Foreach петли:

foreach ($role_perms as $role_perm) { 
    foreach ($all_perms as $all_perm) { 
     if (array_diff_assoc($all_perm, $role_perm)) { 
      $all_perm['check'] = 1; 
     } 
    } 
} 

Но я понятия не имею, почему я получаю ошибку

array_diff_assoc(): Аргумент # 1 не является массивом (на линии кода с оператором if.)

Я что-то не так? Спасибо за любую помощь

+1

'var_dump ($ all_perm, $ role_perm);' – Federkun

+0

Вы путаете "массив" и "объект". – arkascha

+0

@arkascha, пожалуйста, вы можете мне разъяснить это. Первые два, которые я назвал объектами, я думал, что это объекты, содержащие массивы? Это где я его смущаю? –

ответ

1

array_diff_assoc() предназначен для сравнения массивов. А ваших данных нет.

Если вы хотите использовать array_diff_assoc(), измените свою структуру данных, чтобы у вас был массив массивов. Например:

$your_array = [ 
    [ 
     "id" => 3, 
     "name"=>"create-post", 
     "display_name"=>"Create post", 
     "description"=>"create new post" 
    ], 
    [ 
     "id"=>4, 
     "name"=>"edit-post", 
     "display_name"=>"Edit post", 
     "description"=>"edit existing post" 
    ] 
]; 

Отредактировано: В качестве обходного пути, объекты литых к массивам в случае, если вы не можете изменить структуру данных.

$object = new stdClass(); 
    $object->a = 'AAA'; 
    $object->b = 'BBB'; 

    var_dump((array) $object); 

Выход:

array(2) { ["a"]=> string(3) "AAA" ["b"]=> string(3) "BBB" } 

В вашем случае:

foreach ($role_perms as $role_perm) { 
    foreach ($all_perms as $all_perm) { 
     if (array_diff_assoc((array) $all_perm, (array) $role_perm)) { 
      $all_perm['check'] = 1; 
     } 
    } 
} 
+0

Извините, я не уточнил достаточно. Данные, которые я предоставил, были написаны мной вручную, но на самом деле это записи из базы данных. Означает ли это, что значения, возвращаемые из базы данных, не относятся к массиву типов? Извините, опять-таки это не имеет смысла, потому что я новичок в php? –

+0

Если вы не можете изменить исходную структуру данных, в качестве обходного пути вы можете применять объекты к массиву до использования array_diff_assoc(). Я добавляю пример к моему ответу. – MarcM