php bir dizide 'yeni' değerleri alma

5 Cevap php

Bugün php diziler hakkında bilgi edinmek için çalışıyorum.

Ben böyle diziler bir dizi var:

$a = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ),  
    2 => array ( 'value' => 'Australia', ), 
)
$b = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ), 
    2 => array ( 'value' => 'Canada', ), 
)

Ben dizi b masaya getiriyor 'yeni' Altdizilim almak gerekir.

yani, ben dönmek gerekiyor array ( 'value' => 'Canada', )

Ben ilk $ a + $ b birleştirme ve daha sonra A $ sonucu karşılaştırabilirsiniz düşündüm.

$merge = array_merge($a,$b);
$result = array_diff($merge,$a);

Ama nedense bu çalışmıyor. Bu döner array()

Nasıl olur? Ve teşekkürler!

5 Cevap

Bu hile yapmak gerekir:

$new = array();
foreach($b as $elem){
    if(!in_array($elem, $a)){
        $new[] = $elem;
    }
}

Kanada döndürür.

I'm not a hundred per cent sure on what you are asking. If you want to return the Canada part of array $b in a function you can use return $b[2]. That will return an array containing value=>Canada. If you want to display the content of the array you can use the var_dump function like this.

var_dump($VaribleToDisplay);

var_dump başka değişken türleri için de kullanılabilir.

I array_merge($a, $b) kadar kodu çalıştırmak ve eğer bir var_dump($merge), ben bu olsun:

array(6) {
  [0]=>
  array(1) {
    ["value"]=>
    string(7) "America"
  }
  [1]=>
  array(1) {
    ["value"]=>
    string(7) "England"
  }
  [2]=>
  array(1) {
    ["value"]=>
    string(9) "Australia"
  }
  [3]=>
  array(1) {
    ["value"]=>
    string(7) "America"
  }
  [4]=>
  array(1) {
    ["value"]=>
    string(7) "England"
  }
  [5]=>
  array(1) {
    ["value"]=>
    string(6) "Canada"
  }
}

Yani aklında ne vardı, değil.

-

Ayrıca php.net üzerine array_diff 's belgelerine okur:

Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.
Note: This function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using array_diff($array1[0], $array2[0]);. 

Diziniz ortak anahtarları tarafından endeksli Altdizilim içerdiğinden, vb, array_merge, array_diff kullanamazsınız çünkü tuşları (alt diziler) tarafından endeksli dizileri ile olan anlaşma.

Siz ne istediğinizi yapmak için array_walk kullanabilirsiniz, ancak çok daha fazla kod alacaktır. Benzer bir şey düşünün:

$newVals = array();

function walker($sub, $key, $otherArray)
{
    $found = false;
    foreach($otherArray as $idx => $sub2)
    {  
        if ($sub['value'] == $sub2['value'])
        {
            $found = true;
            break;
        }
    }
    if (!$found)
        $newVals[] = $sub;
}

array_walk($a, 'walker', $b);

Bu özellikle hızlı değildir. (Yerine alt dizilerine göre) dizideki doğrudan anahtar => değer kullanmak için giriş verileri değiştirebilirsiniz sonra array_diff ve array_merge çalışacak ve çok daha hızlı olacaktır.

yani gerçekten bu gibi verilerinizi yeniden isterim:

 $a = array( 'America', 'Australia', 'Canada' );

Ya da benzer bir şey.

neden böyle diziniz kurmak isteyen için bu bir select veya bir şey?

$a = array('countries'=> array('America', 'England', 'Australia'));
$b = array('countries'=> array('America', 'England', 'Canada'));
array_diff($b['countries'], $a['countries']);