Bir dizideki değerleri PHP listesi () doldurmamak

6 Cevap php

Ben bir dizi var:

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');

Ben o diziye elemanları listemde değişkenleri () olarak görünmesini istiyorum:

list($foo, $bar, $bash, $monkey, $badger) = $data;

Aslında değişkenleri belirtmeden, denedim;

list(implode(",$", $arr)) = $data; and
list(extract($arr)) = $data;

Ama onlar işe yaramazsa, ben alıyorum:

Fatal error: Can't use function return value in write context

Herkes bu mümkün olup olmadığını herhangi bir fikrin var mı?


GÜNCELLEME: Daha fazla içerik:

Ben bir API veri CSV alıyorum, birinci satır izleyen her satır veri, sütun adlarıdır. Şöyle bir ilişkisel dizi inşa etmek istiyorum:

$data[0]['colname1'] = 'col1data';
$data[0]['colname2'] = 'col2data';
$data[0]['colname3'] = 'col3data';
$data[1]['colname1'] = 'col1data';
$data[1]['colname2'] = 'col2data';
$data[1]['colname3'] = 'col3data';

Bunu yapmadan önce, ancak, ben gereken tüm sütunları olduğundan emin olmak istiyorum. Yani, CSV ihtiyacım tüm sütunları içermiyor sağlamak için bazı kontrolleri çalıştırmak, ben gerektiren sütun adları ile bir dizi oluşturmak. Bir kez yapılır, thats kodu (CSV veri her satır için) (bir foreach üzerinde yürütüldüğü) biraz bu gibi görünüyor:

//$data is an array of data WITHOUT string indexes
list(   $col1,
    $col2,
    $col3,
    ...
    $col14
 ) = $data;

foreach($colNames AS $name)
{
    $newData[$i][$name] = $$name;
}
// Increemnt
$i++;

Yerine açıkça her değişken adı koyarak, liste fonksiyonu BU kullanmak için biraz zaman kazanmak istiyorum gerçi ben zaten sütun adının bir dizi, ben gibi.

Veri temizlenmiş ve başka bir yerde dezenfekte edilir.

Alkış,

Mikrofon

6 Cevap

Bunu kullanılacak demek değil ki bir şekilde bir dil yapısı kullanmak için çalışıyveyauz. Alvaro belirtildiği gibi variable variables kullanın.

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');
fveyaeach ($arr as $index => $key) {
    $$key = $data[$index];
}

veya

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');
$result = array();
fveyaeach ($arr as $index => $key) {
    $result[$key] = $data[$index];
}
extract($result);

In shveyat, do not use "list", use arrays and associated arrays. Write helper functions to make your code clearer.

Ben o diziye elemanları listemde değişkenleri () olarak görünmesini istiyorum:

i problem anlayış olduğunu düşünüyorum. list () Yeni bir liste yapısı veya değişken oluşturmak değil, sadece aynı anda birçok değişkenleri atamak için kullanılabilir:

$arr = array(1, 2, 3);
list($first, $second, $third) = $arr;
// $first = 1, $second = 2, $third = 3

http://php.net/list daha fazla bilgi için bkz.

muhtemelen bir associative array arıyoruz. Aşağıdaki kod ile oluşturabilirsiniz:

$arr = array('first' => 1, 'second' => 2, 'third' => 3);
// $arr['first'] = 1, …

Lütfen giriş dosyasında bazı satırlar eksik sütunlar iseniz, gerçekten bir eksik olduğu bilemez. Değerlerin sayısını sayma ve iptal ya da beklenenden daha az yeterli olmalıdır zaman sonraki satıra atlama.

... Eğer son sütun isteğe bağlı olduğunu kural kümesi sürece. Ben bu konuda ayrıntılı olacak.

Sizin kod numune tam için çok ama senin sorunun değerleri, hücre sütun adları eşleşen hariç her yerde dizileri kullanarak olmasıdır görünüyor. De diziler kullanın: Eğer bağımsız değişkenler gerek yoktur ve onlar sadece zor yapmak. Bu yeterince açık olası yaklaşımlardan biri, ille iyi biri ama (umarım) 'dir:

<?php

$required_columns = array('name', 'age', 'height');
$input_data = array(
    array('John', 33, 169),
    array('Bill', 40, 180),
    array('Ashley', 21, 155),
    array('Vincent', 13), // Incomplete record
    array('Michael', 55, 182),
);
$output = array();

foreach($input_data as $row_index => $row){
    foreach($required_columns as $col_index => $column_name){
        if( isset($row[$col_index]) ){
            $output[$row_index][$column_name] = $row[$col_index];
        }
    }
}

print_r($output);

?>

Ben $ row_index ve basitlik için $ col_index kullandım.

Original answer, for historical purposes only ;-)

Ben gerçekten gözlük ama PHP özelliklerini anlayamıyorum variable variables:

<?php

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');

foreach($arr as $i){
    $$i = $i;
}

?>

Bu oldukça yararsız ve tehlikeli olabilir ... $ foo, $ bar ama ihtiyacınız görünüyor ne yapar: Şimdi komut bu değişkenler mevcut bulunmaktadır.

neden derhal gibi değişkenler demiyveyalar

$arr['foo']

veya

$arr[0]

Eğer geçerli bağlam içine $data öğeleri ayıklamak istiyorsanız, size elemanları $ veri kısmak için extract . You might find it useful to call array_intersect_key ile ilk yapabilirim ayıklamak istiyorum.

Böyle deneyin olabilir:

$arr = array('foo', 'bar', 'bash', 'monkey', 'badger');
$data = "$".implode(",", $arr);
echo str_replace(",", ",$", $data);