繁体   English   中英

PHP,多维数组,从数组中查找键和返回值

[英]PHP, Multi Dimensional Array, Find a Key and Return Value from an Array

好的,所以我试图四处搜索,并且已经为此工作了 48 小时,但我被困在头痛的地步,非常感谢一些关于我哪里出错的帮助。

因此,对于我的用例,我有一个 Wordpress 站点,我正在尝试根据我上传到后端并转换为数组的 csv 列表以编程方式为帖子设置默认标签。 当页面加载到数组内部时,我需要能够搜索特定字段,然后提取一个键值以输入 wp_set_post_tags() 参数。 这是我到目前为止所拥有的:

    $sku_file_upload = get_field( 'sku_file_upload', 'option' );
$skufileurl = $sku_file_upload['url'];
$skulist = array();
$term_name = get_field('mold_sku');
$rows = file($skufileurl);
$header = array_shift($rows); //get the header out
$header = explode(",", $header);
$final_array = array();

foreach ($rows as $row) {
    $row = explode(",", $row);
    $header[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $header[3]);
    $row[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $row[3]);
    $row[3] = str_replace(array("|"), ',', $row[3]);
    $final_array[] = array($header[0] => $row[0], $header[1] => $row[1], $header[2] => $row[2], $header[3] => $row[3]);
}

这完全按预期工作,并为我提供了以下数组(41 个值,在此处查看):

(
    [0] => Array
        (
            [Mold SKU] => 12MM-SM-SQ
            [Title] => 12mm Squares
            [Category] => Earings|Earings > Fishhooks
            [Tags] => square ,
        )

    [1] => Array
        (
            [Mold SKU] => 12MM-SQ-HOLLOW-DROP
            [Title] => Square Hollow Drop Studs
            [Category] => Earings|Earings > Studs
            [Tags] => square ,
        )

)

顺便说一句,我曾考虑过修改代码以提供另一种搜索方式,但不知道如何使其工作,但也会显示此版本。 唯一的变化是上面的最终 foreach 循环提供我在关联数组名称中的每个帖子上寻找的值:

foreach ($rows as $row) {
    $row = explode(",", $row);
    $header[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $header[3]);
    $row[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $row[3]);
    $row[3] = str_replace(array("|"), ',', $row[3]);
    $final_array[$row[0]] = array($header[1] => $row[1], $header[2] => $row[2], $header[3] => $row[3]);
}

这会给我以下内容:

Array
(
    [12MM-SM-SQ] => Array
        (
            [Title] => 12mm Squares
            [Category] => Earings|Earings > Fishhooks
            [Tags] => square ,
        )

    [12MM-SQ-HOLLOW-DROP] => Array
        (
            [Title] => Square Hollow Drop Studs
            [Category] => Earings|Earings > Studs
            [Tags] => square ,
        )
)

但我离题了,只是想提供它,以防它提供更好的解决问题的方法。 所以在我有了这个之后,我在页面加载上执行以下代码,看看事情是否正常:

foreach ($final_array as $value){

    echo '<pre>';
    print_r($value['Mold SKU']);
    echo '</pre>';

令人失望的是,我得到了大量的空白行,但如果我将 print_r 替换为任何其他键(显然在我的第一个示例中为“标题”或“类别”或“标签”),情况并非如此。

我想知道发生了什么,如果它与我的钥匙中的 - 有关? 我不相信,因为我把它拿出来了,结果还是一样。

我永远无法超越这个阶段,但这是我最想做的事情:

我在每个页面的后端都有一个自定义字段,即“mold_sku”,我希望该值成为我在数组中搜索的值。 例如,当前页面上的 SKU 可能是“12MM-SQ-HOLLOW-DROP”,我想查看我创建的 $final_array,找到该值,然后我需要提取“Tags”值并插入将它们放入 wp_set_post_tags() 参数中。 以下是我的设想:

  1. 遍历数组并通过使用定义为 $term_name = get_field('mold_sku'); 的 $term_name 搜索找到包含我需要的值的子数组并将其输入 $mold_sku。

  2. 使用该变量执行:

wp_set_post_tags($post_id, $tags, true);

我不会将我尝试过的所有 forloops 变体都放在这里,因为它不会让事情变得更清楚(至少我不这么认为),而且我觉得这已经很清楚了。

感谢可以提供的任何帮助,为我指明正确的方向。

编辑

也许对 go 更好的方法是在多维数组中搜索包含我需要的信息的数组,并返回该值数组以便我可以操作它?

CSV 供参考

Mold SKU,Title,Category,Tags
12MM-SM-SQ,12mm Squares,Earings|Earings > Fishhooks,square |
12MM-SQ-HOLLOW-DROP,Square Hollow Drop Studs,Earings|Earings > Studs,square |
12MM-SQ-O-CUTOUT,Square O Cutouts,Earings|Earings > Fishhooks,square | o | 
13MM-CIRCLES,13mm Circles,Earings|Earings > Fishhooks,circle |
14MM-SS-STUD,Studs,Earings|Earings > Studs,metal|stainless-steel |
14MM-TRI,Triangles,Earings|Earings > Fishhooks,triangle |
16MM-SS-CIRCLES,Stainless Steel Circles,Earings|Earings > Fishhooks,metal|stainless-steel | 
17MM-BBALL-DIAMONDS,17mm Baseball Diamonds,Earings|Earings > Fishhooks,baseball-diamond|
17MM-BBALL-DIAMOND-STUD,17mm Baseball Diamond Studs,Earings|Earings > Studs,baseball-diamond|
17MM-ROUND-CROSS,Rounded Cross,Earings|Earings > Fishhooks,round-cross |
18MM-DROPS,Drops,Earings|Earings > Fishhooks,drop|
18MM-STAR,Gold Stars,Earings|Earings > Fishhooks,star | 
19MM-OVAL,Ovals,Earings|Earings > Fishhooks,oval|
20MM-CIRCLES,Circles,Earings|Earings > Fishhooks,circle|
25MM-CIR-CUT,25mm Circle Cutouts,Earings|Earings > Fishhooks,circle | 
26MM-RECT-BAR,26mm Rectangle Bars,Earings|Earings > Fishhooks,rectangle-bars|
28MM-SQ-HOLLOW,Hollow Squares,Earings|Earings > Fishhooks,square | 
30MM-LEAVES,Leaves,Earings|Earings > Fishhooks,leaf|
33MM-SKIMBOARD,Skimboards,Earings|Earings > Fishhooks,skim-board | 
36MM-LONG-TRI,Long Triangles,Earings|Earings > Fishhooks,triangle | 
38MM-DIAMOND,Diamonds,Earings|Earings > Fishhooks,diamond | 
38MM-DIAMOND-CUT,Diamond Cutouts,Earings|Earings > Fishhooks,diamond |
39MM-PENTAKINDAGON,Pentakindagon,Earings|Earings > Fishhooks,pentagon | 
40MM-CIR-CUTOUT,Circle Cutouts,Earings|Earings > Fishhooks,circle|
56MM-SQ-WIN,Square Windows,Earings|Earings > Fishhooks,square | 
9MMCIR-19MMOVAL-STUD,Circle Oval Studs,Earings|Earings > Studs,oval|
CIR-CAPSULE-CUT-STUD,Circle Capsule Cutouts,Earings|Earings > Fishhooks,capsule|circle | 
CIRCLE-SQ-STUD,Circle Hollow Square Studs,Earings|Earings > Studs,square|
CIR-CUT-SQ-CUT,Circle Squares,Earings|Earings > Fishhooks,circle|square | 
CIR-SQ-CUT-STUD,Circle Square Cutout Studs,Earings|Earings > Studs,circle|square | 
HOLLOW-DROP,Hollow Drops,Earings|Earings > Fishhooks,drop|
SQ-CUT-STUD,Square Cutout Studs,Earings|Earings > Studs,square | 
SS-PRISM,Hollow Prisms,Earings|Earings > Fishhooks,metal|stainless-steel | 
TRI-STUD,Triangles,Earings|Earings > Fishhooks,triangle | 
OBTUSE-TRI,Obtuse Triangle,Earings | Earings > Fishhooks,triangle | 
CIR-SIDE-SQ-CUTOUT,Circle Side Square Cutout Studs,Earings|Earings > Studs,circle | square | 
CIR-CLOUD,Circle Cloud Studs,Earings|Earings > Studs,circle | cloud | 
LINK-CHEVRON,Link Chevrons,Earings | Earings > Fishhooks,chevron | link | 
DIAMOND-CHEVRON,Diamond Chevrons,Earings | Earings > Fishhooks,chevron | diamond | 
9MM-CIR,9mm Circles,Earings | Earings > Fishhooks,circle | 
11MM-CIR,11mm Circle Studs,Earings|Earings > Studs,circle | 
ini_set('auto_detect_line_endings', true);

$fp = fopen($skufileurl, 'r');
$termName = 'Example SKU';

$csvHeader = fgetcsv($fp);
while ($csvRow = fgetcsv($fp)) {
    $keyedCsvRow = array_combine($csvHeader, $csvRow);

    if ($keyedCsvRow['Mold SKU'] === $termName) {
        $keyedCsvRow['Category'] = explode('|', $keyedCsvRow['Category']);
        $keyedCsvRow['Tags'] = explode('|', $keyedCsvRow['Tags']);
        
        $finalArray = $keyedCsvRow;
        break;
    }
}

fclose($fp);

工作示例

参考

  • fopen - 获取文件指针
  • fgetcsv - 将行解析为 csv,作为数组返回
  • array_combine - 使用第一个数组作为键,第二个作为值

附加信息

  • wp_set_post_tags接受标签作为数组,所以你可以传递它们,因为它们是$finalArray['Tags']
  • 看看 JSON ( json_encodejson_decode )。 它是保存 sku 文件的更好格式。 将替换 csv。 arrays 中的 Arrays 将是显而易见的。

你的问题应该是什么样子

标题:从 csv 文件中解析和过滤数据

嗨,我正在尝试读取 csv 文件的Tags ,如下所示:

// example data of csv file (with header!)

我需要获取必须与Mold SKU匹配的给定$term_name的所有Tags 这是我尝试过的。

// code attempt (+optionally comment where you got stuck)

非常感谢您的帮助:)

快乐编码:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM