Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多维数组的PHP foreach未打印所有值_Php_Arrays_Multidimensional Array - Fatal编程技术网

具有多维数组的PHP foreach未打印所有值

具有多维数组的PHP foreach未打印所有值,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个非常简单的多维数组和一些PHP代码。代码应该打印p_id值,但不打印。我真的需要再增加一个还是有其他方法 这是数组: Array ( [2764] => Array ( [status] => 0 [0] => Array ( [p_id] => 2895 ) [1] => Array ( [p_id] => 1468 ) ) [5974] => Array (

我有一个非常简单的多维数组和一些PHP代码。代码应该打印p_id值,但不打印。我真的需要再增加一个还是有其他方法

这是数组:

Array (
  [2764] => Array (
    [status] => 0

    [0] => Array (
      [p_id] => 2895
    )

    [1] => Array (
      [p_id] => 1468
    )
  )

  [5974] => Array (
    [status] => 0

    [0] => Array (
      [p_id] => 145
    )

    [1] => Array (
      [p_id] => 756
    )
  )
)
以下是我的PHP代码:

foreach($arr as $innerArray)
  foreach($innerArray as $key => $value)
    echo $key . "=>" . $value . "<br>";

使用递归函数:

function printIds($arr) {
    foreach ($arr as $key => $val) {
        if (is_array($val) && array_key_exists("p_id", $val)) {
            echo $val["p_id"]."\n";
        } elseif(is_array($val)) {
            printIds($val);
        }
    }
}
工作示例:

$arr = [
    2764 => [
        'status' => 0,
        ['p_id' => 100],
    ],
    4544 => [
        'status' => 0,
        ['p_id' => 100],
    ],
    ['p_id' => 100],
];

function printIds($arr) {
    foreach ($arr as $key => $val) {
        if (is_array($val) && array_key_exists("p_id", $val)) {
            echo $val["p_id"]"\n";
        } elseif(is_array($val)) {
            printIds($val);
        }
    }
}

printIds($arr);
函数循环给定数组的所有条目,如果它们包含一个名为p_id的键的数组,则echo将其输出。如果它确实找到一个嵌套数组,则它也会循环所有子数组。

此简单调用生成问题中请求的输出:

array_walk_recursive(
    $arr, 
    function ($value, $key) {
        echo $key . "=>" . $value . "<br>";
    }
);
输入数组的结构告诉我应该首先修复生成它的代码。它应该将现在由数字键索引的所有值组合到一个数组中。应该是这样的:

$input = array(
    '2764' => array(
        'status' => 0,
        'products' => array(
            2895 => array(
                'p_id' => 2895,
                'name' => 'product #1',
                // more product details here, if needd
            ),
            1468 => array(
                'p_id' => 1468,
                'name' => 'product #2',
            ),
            // more products here
        ),
    // more categories here
),
foreach ($arr as $catId => $catInfo) {
    // Category ID and details; use other names if I'm wrong
    printf("Category: %d (status: %s)\n", $catId, $catInfo['status'] ? 'active' : 'inactive');
    foreach ($catInfo['products'] as $prodInfo) {
        printf("    %s (ID: %d)\n", $prodInfo['name'], $prodInfo['p_id']);
        // etc.
    }
}
然后打印它的代码将如下所示:

$input = array(
    '2764' => array(
        'status' => 0,
        'products' => array(
            2895 => array(
                'p_id' => 2895,
                'name' => 'product #1',
                // more product details here, if needd
            ),
            1468 => array(
                'p_id' => 1468,
                'name' => 'product #2',
            ),
            // more products here
        ),
    // more categories here
),
foreach ($arr as $catId => $catInfo) {
    // Category ID and details; use other names if I'm wrong
    printf("Category: %d (status: %s)\n", $catId, $catInfo['status'] ? 'active' : 'inactive');
    foreach ($catInfo['products'] as $prodInfo) {
        printf("    %s (ID: %d)\n", $prodInfo['name'], $prodInfo['p_id']);
        // etc.
    }
}

这个代码是做什么的?有什么问题?可以使用打印数组中包含的所有键和值。但是它没有揭示数组的内部结构,也没有太大帮助。在你的示例中,你有三维数组,但你只循环了二维。不,你还需要检查第二层的键是否为status,resp。第二级上的元素是否为数组。您不需要额外的foreach循环—您已经知道,假设数据结构是一致的,最后一级上的数组只有一个键为p_id的元素。数组有3级深,代码只迭代外部2级。第2级上的一些对象是数组,它们生成第3级,这就是代码打印数组的原因。
foreach ($arr as $catId => $catInfo) {
    // Category ID and details; use other names if I'm wrong
    printf("Category: %d (status: %s)\n", $catId, $catInfo['status'] ? 'active' : 'inactive');
    foreach ($catInfo['products'] as $prodInfo) {
        printf("    %s (ID: %d)\n", $prodInfo['name'], $prodInfo['p_id']);
        // etc.
    }
}