2016-04-19 3 views
0

У меня есть переменная, которая, содержащий эти вложенные массивы:Как удалить все элементы массива, кроме определенного?

echo $var; 

/* Output: 
Array(
     [0] => Array 
     (
      [id] => 1 
      [box] => 0 
     ) 

     [2] => Array 
     (
      [id] => 2 
      [box] => 0 
     ) 

     [3] => Array 
     (
      [id] => 3 
      [box] => 1 
     ) 
) */ 

Теперь я хочу, чтобы удалить все элементы массива выше, за исключением $numb = 2;(значение идентификатора). Я имею в виду, что я хочу этот выход:

echo newvar; 

/* Output: 
Array(
     [2] => Array 
     (
      [id] => 2 
      [box] => 0 
     ) 
) */ 

Как это сделать?


На самом деле я могу сделать его часть, используя if заявление и array_shift() функции:

foreach($var as $key => $val) { 
    if($val["id"] != 2) { 
     array_shift($var); 
    } 
} 

Но выход кода выше, не хочу, что мне нужно.

+4

почему бы не просто создать новый массив? '$ cleansed = $ arr [$ id_you_want]; снята с охраны ($ обр) '? гораздо эффективнее всего копировать один элемент, который вы хотите сохранить, а не многократно удалять ненужные вещи. –

+0

@MarcB emm, неплохо ... спасибо – stack

+2

является '2' ключом массива или значением' id' внутри него? –

ответ

2

Вы можете использовать несколько отличий t.

foreach ($var as $item) { 
    if ($item['id'] == 2) { 
     $newvar = $item; 
     break; 
    } 
} 

Вы также можете использовать array_filter

$id = 2; 
$newvar = array_filter($var, function($x) use ($id) { return $x['id'] == $id; }); 

, но, скорее всего, будет менее эффективным, как это должно было бы проверить каждый элемент массива.

+0

Просто небольшое примечание. Иногда это число не существует в массиве, и я хочу, чтобы в этом случае он возвращал значение «null», возможно ? – stack

+1

Если элемент не найден, '$ newvar' никогда не будет установлен. Вы можете инициализировать его до «null» перед циклом. –

+0

[DEMO] (https://3v4l.org/Aot48) – stack

1

Вы можете просто создать новый массив:

$oldArray = array(0 => 'a', 1 => 'b', 2 => 'c', 3=> 'd'); 

$index = 2; 
$newArray = array($index => $oldArray[$index]); 

// or even 
$newArray = [$index => $oldArray[$index]]; 

Если вам не нужно, чтобы сохранить индекс вы можете просто сделать:

$newArray = [$oldArray[$index]]; 
+0

Посмотрите, я обновляю свой вопрос, фактически, что' 2' не является индексом массива, это значение 'id'. – stack

+0

В этом случае это выглядит так: '$ key' - это индекс для вашего массива - вы можете использовать это вместо переменной' $ index' в моем ответе. (например, '$ newvar = array ($ var [$ key]);') – Hannele

0

мне интересно, сколько контекст поможет мы с ответом на ваш вопрос ... Вот ответ на то, что вы задали:

$newArray = array($var[2]); 
1

array_reduce() бы также сделать работу:

$array = [ 
    ['id' => 1, 'box' => 0], 
    ['id' => 2, 'box' => 0], 
    ['id' => 3, 'box' => 1] 
]; 
$id = 2; 
$result = array_reduce ($array, function ($carry, $item) use ($id) { 
    if ($item['id'] === $id) 
     $carry[$item['id']] = $item; 
    return $carry; 
}, []); 
Смежные вопросы