PHP: eleman gösterici tarafından dizi elemanını çıkartın (takma ad)

2 Cevap php

Bir gösterici ile bir dizi elemanı kaldırmak mümkün mü?

Çok boyutlu dizi:

$list = array(
    1=>array(
          2=>array('entry 1'),
          3=>array('entry 2')
    ),
    4=>'entry 3',
    5=>array(
          6=>array('entry 4')
    )
);

Referans dizi:

$refs = array(
     1=>&$list[1], 
     2=>&$list[1][2],
     3=>&$list[1][3],
     4=>&$list[4],
     5=>&$list[5],
     6=>&$list[5][6]
);

Referans dizi çok boyutlu dizi elemanlarına sadece işaretçi (takma ad) içerir. Şimdi ben (unlink) $ liste dizideki öğeleri silmek istiyorum.

By using

    $n=3;
    unset($refs[$n])
but PHP only deletes the pointer.

Herhangi bir yardım için teşekkür ederiz.

2 Cevap

Sizin referans dizi yanlış gibi görünüyor:

$refs = array(
     1 => &$list[1],
     2 => &$list[2],
     3 => &$list[3],
     4 => &$list[4],
     5 => &$list[5],
     6 => &$list[6]
);

Ama $list dizi elemanları 2, 3 ve 6 içermez. Yani $refs dizisi oldukça gibi görünmelidir:

$refs = array(
     1 => &$list[1],
     2 => &$list[1][2],
     3 => &$list[1][3],
     4 => &$list[4],
     5 => &$list[5],
     6 => &$list[5][6]
);

Gereksinimleri Yapabileceğin ne bağlı olarak:

$refs[2] = null;
unset($refs[2]);

Ama bu NULL içeren bir dizi elemanı olarak $list[1][2] bırakacaktır.

EDIT:

Bu kaynak dizi $list bazı özyinelemeli arama fonksiyonu başvurmak zorunda bulunuyor den eleman çıkarmak için (denenmemiş - bazı verdiği gerekebilir):

function removeElement($element, array &$array)
{
    foreach ($array as $key => &$value) {
        if ($element == $value) {
            unset($array[$key]);
            return true;
        } else if (is_array($value)) {
            $found = removeElement($element, $value);
            if ($found) {
                return true;
            }
        }
    }
    return false;
}

removeElement($refs[2], $list);

Sanki, "üst" eleman ve dizin bir referans olarak saklamak mümkün olacaktır

<?php
$list = array(
  1=>array(
    2=>array('entry 1'),
    3=>array(
      4=>'entry 2',
      5=>'entry 3'
    )
  ),
  2=>'entry 3',
  5=>array(
    'foo'=>'entry 4',
    1=>'entry 99'
  )
);

// delete
$refs = array(
  // 'entry 2'
  array(&$list[1][3], 4),
  // and 'entry 4'
  array(&$list[5], 'foo')
);

foreach($refs as $r) {
    unset($r[0][$r[1]]);
}
print_r($list);