Foreach возвращает только первую букву элемента массива? - PullRequest
2 голосов
/ 27 марта 2012

Есть почти идентичный вопрос , но я понятия не имею, что делать в моем случае.

Я только начинаю с OO PHP, и у меня есть эта функция в моем классе:

public function show() {
    foreach($this->data['fields'] as $field) {
        $type = $field['type'];
        echo $type;
    }
}

Вот входные данные:

my_function('id', 
    array(
    'foo' => 'bar',
    'bar' => 'foo',
    'fields' => array(
        'type' => 'my_type',
        'foo' => 'bar',
        'etc.' => 'value'),
    ),
);

Конечно, echo $field['type'] возвращает только первую букву my_type (m).

И я не могу просто использовать echo $field, так как у меня есть несколько ключей в этом массиве, и он возвращает my_typebarvalue вместо my_type, то же самое происходит с $field[0] (mbv). Что мне делать?

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

Когда вы перебираете поля, которые следующие:

array(
   'type' => 'my_type',
   'foo' => 'bar',
   'etc.' => 'value'
)

с помощью

foreach($this->data['fields'] as $field) 

На каждой итерации, $field - это уже значения, которые вы ищете (my_type, bar, value), поэтому выполнение $ field ['type'], как упоминалось в @zneak, заставит php жонглировать 'type' до 0, следовательно, вы получите первый символ.

Чтобы получить значение, когда вы находитесь в ключе типа, вы можете сделать следующее:

public function show() {
    foreach($this->data['fields'] as $key => $field) {
        if($key == 'type') echo $field;
    }
}
2 голосов
/ 27 марта 2012

В $this->data['fields'] есть три пары ключ-значение: type => my_type, foo => bar и etc. => value. При использовании этого синтаксиса foreach, $field будет содержать только значение пары, которая всегда является строкой.

Оператор индекса (в скобках после переменной, как в $foo['bar']) также работает со строками и возвращает символ с заданным индексом. Тип juggling превращает строку 'type' в целое число 0, и, таким образом, вы получаете первый символ строки.

Я не уверен, что вы хотите, на самом деле, если echo $field не в порядке. PHP не будет печатать символы новой строки или разделители без запроса, поэтому вы можете попробовать echo $field . ' ' и увидеть, что значения на самом деле различны.

1 голос
/ 27 марта 2012

foreach будет перебирать все элементы в $data['fields'].На первой итерации $field будет "my_type", на второй итерации $field будет "bar" и так далее.Т.е. на каждой итерации $field будет строкой, а не массивом.

Вам понадобится массив массивов, чтобы этот цикл имел смысл, например:

'fields' => array(
    array(
        'type' => 'my_type',
        'foo' => 'bar',
        'etc.' => 'value',
    ),
    ...
)
0 голосов
/ 27 марта 2012

Ваш массив 'fields' имеет вид:

    $fields['type'] = 'my_type';
    $fields['foo'] = 'bar';
    $fields['etc'] = 'value';

Означает, что ваш массив имеет только одно измерение.Так что доступ к нему, как указано выше.
В foreach вы говорите php проходить через ключи (type, foo, ect).Итак, $ field уже (my_type, bar, value)!

// You either need to write:
foreach($this->data as $field) {
    $type = $field['fields']['type'];
    echo $type;
}

// Or
foreach($this->data['fields'] as $field) {
if ($field == 'type') {
        $type = $field;
        echo $type;
}
}

// Or
foreach($this->data['fields'] as $key => $val) {
if ($key == 'type') {
        $type = $val;
        echo $type;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...