我有一个嵌套数组,我想在其中显示结果的子集。例如,在下面的数组中,我想遍历嵌套数组[1]中的所有值。
Array ( [0] => Array ( [0] => one [1] => Array ( [0] => 1 [1] => 2 [2] => 3 ) ) [1] => Array ( [0] => two [1] => Array ( [0] => 4 [1] => 5 [2] => 6 ) ) [2] => Array ( [0] => three [1] => Array ( [0] => 7 [1] => 8 [2] => 9 ) ) )
我试图使用foreach函数,但我似乎无法使用它。这是我的原始语法(虽然我意识到这是错误的)。
$tmpArray = array(array("one",array(1,2,3)),array("two",array(4,5,6)),array("three",array(7,8,9))); foreach ($tmpArray[1] as $value) { echo $value; }
我试图避免对密钥是否与我想要搜索的密钥相同的变量进行比较,即
foreach ($tmpArray as $key => $value) { if ($key == 1) { echo $value; } }
有什么想法吗?
答案 0 :(得分:57)
如果您知道嵌套数组中的级别数,则可以简单地执行嵌套循环。像这样:
// Scan through outer loop
foreach ($tmpArray as $innerArray) {
// Check type
if (is_array($innerArray)){
// Scan through inner loop
foreach ($innerArray as $value) {
echo $value;
}
}else{
// one, two, three
echo $innerArray;
}
}
如果您不知道数组的深度,则需要使用递归。见下面的例子:
// Multi-dementional Source Array
$tmpArray = array(
array("one", array(1, 2, 3)),
array("two", array(4, 5, 6)),
array("three", array(
7,
8,
array("four", 9, 10)
))
);
// Output array
displayArrayRecursively($tmpArray);
/**
* Recursive function to display members of array with indentation
*
* @param array $arr Array to process
* @param string $indent indentation string
*/
function displayArrayRecursively($arr, $indent='') {
if ($arr) {
foreach ($arr as $value) {
if (is_array($value)) {
//
displayArrayRecursively($value, $indent . '--');
} else {
// Output
echo "$indent $value \n";
}
}
}
}
下面的代码只显示嵌套数组,其中包含特定情况的值(仅限第3级)
$tmpArray = array(
array("one", array(1, 2, 3)),
array("two", array(4, 5, 6)),
array("three", array(7, 8, 9))
);
// Scan through outer loop
foreach ($tmpArray as $inner) {
// Check type
if (is_array($inner)) {
// Scan through inner loop
foreach ($inner[1] as $value) {
echo "$value \n";
}
}
}
答案 1 :(得分:3)
foreach ($tmpArray as $innerArray) {
// Check type
if (is_array($innerArray)){
// Scan through inner loop
foreach ($innerArray as $value) {
echo $value;
}
}else{
// one, two, three
echo $innerArray;
}
}
完美适合我......试试这个
答案 2 :(得分:2)
两种语法都是正确的。但结果将是Array
。你可能想做这样的事情:
foreach ($tmpArray[1] as $value) {
echo $value[0];
foreach($value[1] as $val){
echo $val;
}
}
这将打印出字符串“two”($ value [0])以及数组中的整数4,5和6($ value [1])。
答案 3 :(得分:0)
据我了解,所有先前的答案并没有产生Array输出, 就我而言: 我有一个带有父子结构的模型(此处为简化代码):
public function parent(){
return $this->belongsTo('App\Models\Accounting\accounting_coding', 'parent_id');
}
public function children()
{
return $this->hasMany('App\Models\Accounting\accounting_coding', 'parent_id');
}
如果您希望将所有子ID都作为一个Array,则这种方法很好,并且对我有用:
public function allChildren()
{
$allChildren = [];
if ($this->has_branch) {
foreach ($this->children as $child) {
$subChildren = $child->allChildren();
if (count($subChildren) == 1) {
$allChildren [] = $subChildren[0];
} else if (count($subChildren) > 1) {
$allChildren += $subChildren;
}
}
}
$allChildren [] = $this->id;//adds self Id to children Id list
return $allChildren;
}
allChildren()返回,所有的childs作为一个简单的Array。