#php #arrays #foreach #associative-array #array-unique
#php #массивы #foreach #ассоциативный массив #массив-уникальный
Вопрос:
Почему цикл foreach выводит только первое значение из массива?
$Jdata_cate = '[{"category_id":"103","name":"Martin","parent_id":0},{"category_id":"10","name":"Juan","parent_id":0},{"category_id":"9","name":"Kasi","parent_id":0}]';
$J_Min = strtolower($Jdata_cate);
$J_MinDecoded = json_decode($J_Min, true);
$Ddata_cate = '[{"category_id":"55","name":"Abc","parent_id":0},{"category_id":"41","name":"Pedro","parent_id":0},{"category_id":"40","name":"Kasi","parent_id":0}]';
$D_Min = strtolower($Ddata_cate);
$D_MinDecoded = json_decode($D_Min, true);
$both_arrays = array_merge((array)$J_MinDecoded, (array)$D_MinDecoded);
$Delete_repeated = array_unique($both_arrays);
foreach($Delete_repeated as $y=>$y_value){
echo $y_value['name'] . '<br>';
}
Комментарии:
1. Вы не предоставили достаточно информации, чтобы мы могли продолжить. Можете ли вы поделиться массивами?
2. Да, конечно, @JayBlanchard, дайте мне минутку, чтобы изменить вопрос
3. Убедитесь, что вы добавили a
print_r($Delete_repeated)
, который может подсказать вам, что не так с предыдущими операторами4. Цикл Foreach будет повторяться на основе вашего общего индекса, присутствующего внутри массива. Если массив состоит из одного индекса, то он будет печататься один раз.
5. @RiggsFolly Теперь я добавил массивы. Если я добавлю
print_r($Delete_repeated);
, также выводится первое значение массива. Я полагаю, что проблема в том, что эта часть кода$both_arrays = array_merge((array)$J_MinDecoded, (array)$D_MinDecoded);
Проблема в том, что мне нужно смешать два массива, чтобы узнать, какие данные он повторяет. Как я могу это исправить?
Ответ №1:
попробуйте это решение:
function array_unique_multidimensional($array, $key)
{
$temp_array = array();
$i = 0;
$key_array = array();
foreach ($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i ;
}
return $temp_array;
}
$Jdata_cate = '[{"category_id":"103","name":"Martin","parent_id":0},{"category_id":"10","name":"Juan","parent_id":0},{"category_id":"9","name":"Kasi","parent_id":0}]';
$J_Min = strtolower($Jdata_cate);
$J_MinDecoded = json_decode($J_Min, true);
$Ddata_cate = '[{"category_id":"55","name":"Abc","parent_id":0},{"category_id":"41","name":"Pedro","parent_id":0},{"category_id":"40","name":"Kasi","parent_id":0}]';
$D_Min = strtolower($Ddata_cate);
$D_MinDecoded = json_decode($D_Min, true);
$both_arrays = array_merge((array)$J_MinDecoded, (array)$D_MinDecoded);
$Delete_repeated = array_unique_multidimensional($both_arrays, 'name');
foreach ($Delete_repeated as $y => $y_value) {
echo $y_value['name'] . '<br>';
}
здесь вместо array_unique
я использую свою определенную функцию
Ответ №2:
Проблема в том, что вы вызываете array_unique($both_arrays)
поведение по умолчанию для сравнения элементов как строк, но они являются массивами, поэтому он терпит неудачу.
Решение состоит в том, чтобы добавить SORT_REGULAR
флаг в качестве второго параметра.
$Delete_repeated = array_unique($both_arrays, SORT_REGULAR);
Комментарии:
1. Спасибо за вашу помощь, теперь код работает. Поскольку он работает, я заметил, что слово Kasi не удаляется, потому что category_id отличаются. Как я могу удалить слово repeated Kasi в этом случае, если category_id отличается.