PHP bir diziden bir 'sütun' ayıklamak için bir işlevi var mı?

9 Cevap php

Aşağıdaki yapıya sahip diziler, bir dizi vardır:

array(array('page' => 'page1', 'name' => 'pagename1')
      array('page' => 'page2', 'name' => 'pagename2')
      array('page' => 'page3', 'name' => 'pagename3'))

'Name' tuşları sadece değerler ile yeni bir dizi döndürür yerleşik bir işlevi var mı? ben almak istiyorum:

array('pagename1', 'pagename2', 'pagename3')

9 Cevap

Neden işlevi yerleşik olmak zorunda? :) Hayır, hiçbiri kendi yazmak vardır.

Bu Konuya olarak başkalarına karşı burada güzel ve kolay biridir.

$namearray = array();

foreach ($array as $item) {
    $namearray[] = $item['name'];
}

İşte bunu yapmanın işlevsel bir yolu:

$data = array(
            array('page' => 'page1', 'name' => 'pagename1'),
            array('page' => 'page2', 'name' => 'pagename2'),
            array('page' => 'page3', 'name' => 'pagename3'));

$result = array_map(create_function('$arr', 'return $arr["name"];'), $data);
print_r($result);

Fuentesjrs çözüm, ancak özel bir geri arama ile biraz daha genel kullanarak array_walk () için benzer:

// Define the callback
function extract_named_sub_elements(&$item, $key, $name) {
  $item = $item[$name];
}

// Test data
$original = array(
  array('page' => 'page1', 'name' => 'pagename1'),
  array('page' => 'page2', 'name' => 'pagename2'),
  array('page' => 'page3', 'name' => 'pagename3'),
);

// Use a copy, as array_walk() operates directly on the passed in array
$copy = $original;

// Substitute 'name' with whatever element you want to extract, e.g. 'page'
array_walk($copy, 'extract_named_sub_elements', 'name');

print_r($copy);

I don't think there is any need to have a built in function for this. There may be an array in your those array.

$samples=array(
            array('page' => 'page1', 'name' => 'pagename1'),
            array('page' => 'page2', 'name' => 'pagename2'),
            array('page' => 'page3', 'name' => 'pagename3')
            );

$output1=array();
$output2=array();
foreach($samples as $sample){
    array_push($output1,$sample['name']);
    $output2[]=array_splice($sample,1);

}

print_r($output1);
print_r($output2);

$ çıkışı1 çıktı sadece o $ çıkışı2 'sayfa' endeksleme 'parçası kaldırmak isterseniz istediğiniz şeydir.

Eğer sayısal dizi o dizi ve endeksler tüm değerleri ihtiyacınız varsa o zaman kullanabilirsiniz

$array_1=array_values($samples);

ama ben ne anlıyorum, bunu istemedim.

Ne demek istiyorsun array_values?

Düzenleme: Teşekkürler comment-az DOWNVote için. Kim aslında fonksiyonu için belgelerine bakmak için zaman alsaydı, kendi array_values_recursive işlevi yazma bir örnek verir İlk Yorumu görürdük. Bir array_walk ile bu birleştirin ve 'isim' sütunu içine kodlanmış olmazdı oldukça şık bir işlevi olurdu. Sheesh.

Sen ArrayIterator class uzatmak ve yöntemi geçersiz kılabilirsiniz mixed current(void).

class Foo extends ArrayIterator {
  protected $index;
  public function __construct($array, $index) {
    parent::__construct($array);
    $this->index = $index;
  }

  public function current() {
    $c = parent::current();
    return isset($c[$this->index]) ? $c[$this->index] : null;
  }
}

$a = array(
  array('page' => 'page1', 'name' => 'pagename1'),
  array('name' => '---'),
  array('page' => 'page2', 'name' => 'pagename2'),
  array('page' => 'page3', 'name' => 'pagename3')
);

$f = new Foo($a, 'page');
foreach($f as $e) {
  echo $e, "\n";
}

baskılar

page1

page2
page3

Sen 5.5.0 'den PHP in yaşlı sürümü için kendi oluşturmak gerekir.

PHP 5.5.0 ve üstü için array_column fonksiyonu var.

You can find more examples here.

if (!function_exists('array_column')) {
    function array_column($array,$column) {
    $col = array();
    foreach ($array as $k => $v) {
        $col[]=$v[$column];
    }
    return $col;
    }
}

Bu php sürümleri için çalışması gerekir < 5.5 ve fonksiyon mevcut durumda aşağılamak