2012-03-27 2 views
2

There is almost identical question, но я понятия не имею, что делать в моем случае.Foreach возвращает только первую букву элемента массива?

Я только начинаю с 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). Что мне делать?

ответ

2

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

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

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

+0

Я сделал «echo $ field», и после этого все стало ясно! Блестящий ответ, большое спасибо, так выглядит SO (объясняя вещи, а не давая прямые ответы/код). Благодаря! :) – Wordpressor

1

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

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

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

'... 'value'),' должно быть '' значение ', ', правильно? – bfavaretto

+0

Правда. Просто скопируйте и вставьте код OP. :) – deceze

2

Когда вы итерацию над полями, которая заключается в следующем:

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; 
    } 
} 
0

массивом «поле», как:

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

Значит, что ваш массив имеет только один измерение. Так что доступ к нему, как и выше.
В foreach вы указываете php, чтобы пройти через ключи (тип, 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; 
} 
} 
Смежные вопросы