цикл foreach выводит первое значение только в цикле

#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 отличается.