2014-11-07 2 views
1

Я пытаюсь удалить куски многомерного массива, если выполнено определенное условие. Массив может быть, как показано ниже, назовет его $ друзей:Как удалить определенный индекс из многомерного массива в php

array (size=3) 
    0 => 
    array (size=1) 
     0 => 
     object(stdClass)[500] 
      public 'id' => int 2 
      public 'first_name' => string 'Mary' (length=4) 
      public 'last_name' => string 'Sweet' (length=5) 
    1 => 
    array (size=1) 
     0 => 
     object(stdClass)[501] 
      public 'id' => int 9 
      public 'first_name' => string 'Joe' (length=3) 
      public 'last_name' => string 'Bob' (length=3) 
    2 => 
    array (size=1) 
     0 => 
     object(stdClass)[502] 
      public 'id' => int 1 
      public 'first_name' => string 'Shag' (length=4) 
      public 'last_name' => string 'Well' (length=4) 

У меня есть функция под названием is_followed, что давайте мне увидеть, если идентификатор одного из людей в массиве отрабатывался на «пользователь» , Код, который я пытаюсь сделать:

//remove followed friends from the $friends array 
$i=0; 
foreach($friends as $friend) { 
    foreach($friend as $f) { 
     if(Fanfollow::is_followed($id,$f->id)) { 
      unset($friend[$i]); 
     } 
    } 
    $i++; 
} 

Идентификатор $ id является идентификатором текущего пользователя.

Однако, это не работает. Я знаю, что использование unset на $friend, а не $friends, вероятно, является проблемой. Но использование unset on $ friends также не будет работать, потому что это массив более высокого уровня. Есть идеи? Спасибо.

+0

Я не совсем уверен, но я думаю, что проблема связана с «foreach». Я считаю, что было что-то вроде «foreach, работающего с копией» или чего-то еще. Попробуйте ($ i; $ i ATaylor

ответ

1

Если вы пытаетесь снять первые родительские ключи, используйте первые ключи Foreach вместо:

foreach($friends as $i => $friend) { 
       //^assign a key 
    foreach($friend as $f) { 
     if(Fanfollow::is_followed($id,$f->id)) { 
      unset($friends[$i]); 
      // unset this 
     } 
    } 
} 

Или, если только для этого единственного друга:

foreach($friends as $friend) { 
    foreach($friend as $i => $f) { 
        // ^this key 
     if(Fanfollow::is_followed($id,$f->id)) { 
      unset($friend[$i]); 
      // unset this 
     } 
    } 
} 
1

array_filter приходит к спасение:

array_filter($friend, 
    function($f) use($id) { return Fanfollow::is_followed($id,$f->id)); } 
); 

Хотя решение с foreach является законным, array_filter намного понятнее и с точки зрения семантики.

Смежные вопросы